Introduction

Police stops are the milieu of public violence at the hands of a so-called collection of public servants. The stop is the milieu––the situational, and relational space––whereby beatings, harassment, and killings are levied upon black folks disproportionately, and predominantly lower-income black folk, in the American Metropolis, as well as its multiplicitous exurbs, and rural lands. Much empirical research with a stream of large administrative data from policing institutions over the last 20-years have confirmed what black folks have known since the early 20th-century (or maybe even since the end of Reconstruction): that policing is an institution which is disproportionately levied upon black beings and black geographies in a way that affects the black being and geography negatively across a variety of accountable domains. Violence is the most visible, grotesque and forceful form of police interaction with low-income communities of color––it’s true that police themselves are the most visible and embodied form of a State that has neglected, disinvested and stigmatized black folks and black geographies throughout history (Wacquant, 2008)––but does the negative stratification involved in the policing institution end at embodied vulnerability and the loss of life entailed in physical violence, or might it extend and coalesce with material and valued forms of inequality? What are the economic impacts of racial profiling in law enforcement stops––and how might that be a part of a larger schema of policing as an apparatus entailed within racial capitalist orderings of difference?

More research over the last decade or so has begun to focus on the economic impacts of stops, and the way that black folks are most likely to be subjected to economic extraction from the hands of the policing institution. How does this work? Municipal fine farming is a method that policing institutions use to extract fiscal resources from poor folks, and poor folks of color––it’s a method wherein the city police use their power of levying tickets to raise fiscal resources for a given municipality that’s vying for an expanded budget; as opposed to people being ticketed or cited for actual moving violations, they are instead cited because the State unjustly sanctions them for their race, and uses them as a way to expand the fiscal extent of the local government (Wang, 2018). This current study seeks to extend the literature on the economic violence and racio-ethnic sanctioning entailed in the policing institution, by focusing on the question of how law enforcement stops, citations, and search rates are intertwined in a particular American Metropolis: the City of Los Angeles.

The research questions for this project are below:

Are law enforcement stops and outcomes (eg. citations and searches) clustered in particular communities across Los Angeles?

What are the neighborhood factors most associated with these stop and outcome (eg. citation and search) incidences in Los Angeles?

Figure I. Shapefile of the City of Los Angeles

Background

Other studies in the social sciences have sought to quantitatively uncover the racial disparities present across different policing operations: some focus on police killings, some focus on stops and searches, and fewer focus on the economic extraction entailed in disproportionate citation levying (Maksuta, 2021; Meng, 2017; Pierson et al., 2020). In the literature, there have been very few papers that run inferential analysis of policing operations while taking into account the question of space: either through cartographic representation of the spatial distribution of police associated outcomes, or of explicit regression models that account for spatial heterogeneity and spatial dependence. In the literature, it seems as if a couple of the most common methodologies that are used most often––somewhat related to the non-spatial data limitations entailed in most large administrative policing data––in policing research focused on racial disparity, are often the threshold test and the veil of darkness test. The first test uses hit rates (the rate at which a motorists stopped is found with drugs, contraband or weapons, etc.) aggregated across racial subpopulations, compared to the search rates across aggregated across racial subpopulations, in order to determine whether or not a certain racial subpopulation is searched more relative to their hit rate. This method has been used by the Stanford Open Policing Project in partnership with the Los Angeles Times, in a study that had a large impact on the public and political spaces’ perception of policing practices in Los Angeles, in the second decade of the 20th century (Poston, Chang, 2019).

The next method mentioned is the veil of darkness test; this test is used often in criminal legal studies because it’s the most populat causal test to determine racial profiling in law enforcement stop practices (Racial and Identity Profiling Advisory Board, 2019). The test essentially compares stop rates across racial subpopulations in a given time span before sundown, to the stop rates for the associated racial subpopulations after sundown; with the goal of identifying whether the lack of sunlight might serve as some natural exogenous factor that might lead to a reduction in racial profiling, and thereby express different in stop rates across racial subpopulations that are revealed with differences or imbalances in stop rates both internal-temporally (within a given racial subpopulation) and also imbalances in comparison (across a set of given racial subpopulations). The assumption with the veil of darkness is that an officer cannot determine the race of a driver after sundown; this assumption may be hard to establish. Moreover, the test is also aspatial and aggregated stop rates by racial subpopulation not taking into account the area of the city where the stops occurred, and what the neighborhood conditions were of the stops that occurred––this test assumes that an officer wouldn’t expect or assume a driver in a perceptively poor car in a predominantly black area to be a black driver, merely because the sun has gone down. This is a strong assumption and it might be noted that the veil of darkness test demands a series of assumptions that are hard to hold within reality––this may especially be the case with smaller datasets that don’t have a large enough sample size to average out the results across geographies and across time. This study express an overview of these tests in order to lay out what the field has commonly done when examining racial profiling in law enforcement stops, and to express some of their limitations.

There are three papers that this work builds upon. The first is a study of policing killings using spatial regression models, the next is a study analyzing stop and search rates using a panel data set with descriptive and cartographic analyses, and the last is a study which analyzes 20M stops in the United States and uses the veil of darkness and threshold tests to determine racial disparity in law enforcement stops and searches.

The first is a paper from Maksuta (2021) which uses data from the Mapping Police Violence (MPV) database, which has around 10K recorded police killings in the United States using crowdsourced data from folks on the ground. This is important because police don’t accurately record data on the people they kill, and so if any research relies on the internal records from policing institutions to inquire about these killings, then the quality of the data itself would prevent a real analysis of racial disparity and geographic disparity in police killings. While this is an article whose dependent variable is distinct from the one entailed in this paper––the author examines police killings aggregated at the county level across the entire country, while the current paper examines police stop rates, citation rates, and search rates aggregated at the census tract level in a single city––there is still an overlap both with methodology as well as with the domain of interest. The author uses a Spatial Durbin Model (SDM), which takes into account both spatial dependence of the dependent variable, while also taking into account spatial dependence which is related to the independent variables included in a model (or a subset of independent variables included in the model). In the work, the author describes the relative benefit of utilizing spatial econometric models for regional analysis for this purpose, because the basic Ordinary Least Squares (OLS) model, or other models––negative binomial, for instance––may use regional or geographic units while breaking the assumptions of random association due to spatial autocorrelation, which would bias, or at the very least be ‘inappropriate’ for the model estimation. In regard to their findings, the author noted that police-involved homicides (PIH) are positively associated with a county’s concentrated disadvantage and Gini coefficient (a metric of economic inequality), while also being related (indirectly) to the crime rate of the respective county. This study is important because it uncovers the fact that police killings have a very intensive relationship with disadvantaged geographies. While the study is broad in its scope, the study may have been benefited by running multi-level linear regressions that would have taken into account the police killing rates of cities within counties, or of regions of the United States as compared to others. This would have allowed the paper to be more granular in its analysis of the internal heterogeneity that is present within counties, which are quite a large spatial unit to be used to analyze disparity in police killings.

The next paper that this study builds off of is a study by Meng (2017) which uses data from the Toronto Police Service to investigate racial disparity in stops and searches. The author uses Toronto, Canada, as a region of their analysis, and they utilize a dataset that extends over a decade. While this article doesn’t necessarily examine policing through a lens that incorporates a regression-based spatial analysis (SLM, SEM, SDM, etc.), the author does generate their work through a spatial frame. They run descriptive statistics that point towards disparate ratios of stop rates for black and white youth in the city, and then they also note the clustering of this disparity in particular geographies in their site of study. Their findings, as hinted towards prior, establishes that police disproportionately direct their forces against black youth (ie. go about performing racial profiling instances), and that this performance is directed disproportionately in areas that have higher white populations and areas that have higher crime rates. The authors point towards the need for a greater democratization of data, regular administrative review based on stop data, and community policing. While the latter recommendation may be specious, and generated in a pre-Floyd framing centered in the feasibility or hope within police reformism, this work is noted generally for its spatial framing and focus on disaggregating the impact of policing in an age-universalized context, and specifically focusing on how racially targeted police practices impact youth in lower-income communities of color.

The last article that this study mentions is probably the most expansive analysis of racial profiling and disaprity in police interactions with civilians in law enforcement stops, and the paper came out of the NYU Center for Urban Science and Progress (CUSP), as well as the Stanford Open Policing Project (OPP) (Pierson et al., 2020). The paper used the aforementioned aspatial methods used to determine racial profiling in stops and searches: respectively the veil of darkness test and the threshold tests. In an analysis of 100M stops in the United States over nearly 10-years, the authors found that black folks were less likely to be stopped after sunset––leading to the implication that officers are less likely to stop drivers and racially profile them due to merely the loss of information caused by reduction in perceiving race at night, and alternatively, more likely to stop black drivers disproportionately due to the means of perceiving their race. In their words: “We found that black drivers were less likely to be stopped after sunset, when a ‘veil of darkness’ masks one’s race, suggesting bias in stop decisions” (Pierson et al., 2020). Furthermore, their veil of darkness tests also found that there was a lower standard of vehicular or person searches for black and latinx drivers. This essentially means that although black and latinx drivers have similar hit rates (rates at which drugs or contraband are found in the process of the search) to white folks, but they have significantly higher search rates, equating to an inequality in the degree to which police levy their search power unjustly upon these populations. This study is very importance because of the ambition of its scope: policing data has been infamously sparse across the nation due to the way in which policing institutions have been historically disinclined at collecting and publishing accurate data on their racial targeting practices––this study not merely collects data from across the nation, but it also collects a panel data set which includes almost a decade of data. A limitation with this study is that it doesn’t analyze the problem of policing and racial profiling through a spatial frame, even though we know that policing institutions use mapping platforms and technologies to orient the way they deploy their resources in racio-geographically disparate ways, and even though we know that therefore police practices have forms of inequality that relate to particular beings and bodies, but also communities and racial geographies.

In light of this broad literature, with its commensurate and extant limitations, this study seeks to make a small contribution to the study of police practices and racially disparate effects by analyzing the interrelation with stops, citations and searches, in a way that prioritizes an analysis that centers the importance of the material-economic effects associated with racial profiling, while also addressing the question of space in a robust manner.

Data

Our dataset is made up from three predominant sources: I) California Public Records Act (PRA) request data from the Los Angeles Police Department (LAPD) for law enforcement stop data in 2019 with additional addresses included, which allowed this study to geocode and run spatial processes on the data (It’s important to note that this work was supported by SPUR, a research institute in California’s Bay Area, and that this work is a partial but limited product of a larger separate practicum assignment conducted for SPUR, in part of USC’s Master of Public Policy program.) (Public Records Request City of Los Angeles, 2019); II) a range of socio-demographic and socio-economic variables tied to census tracts which come from the U.S. Census Bureau’s American Community Survey 5-Year Estimates––these variables are listed in Table I below, but include racial demographics, income inequality, gender demographics, poverty, and tenure type; and III) a shapefile for the City of Los Angeles which was taken from the LA Open Data Portal.

The study dropped census tracts that had a limited population size (x < 500) or other anomalies, because these outlier calculations would’ve skewed regression results in the calculation of the varied law enforcement outcome dependent variables utilized in this study. Some examples of census tracts that were dropped included those which held UCLA, LAX, Griffith Park and the LA Dodgers Stadium (Collins, Stuart, Janulis, 2022). In taking a larger step back, there were ~709k stops that the Los Angeles Police Department conducted in 2019. The present analysis was able to successfully geocode ~690k stops. In further limiting the data, we removed stops that lied outside of the LAPD census tracts, outside of the previously subsetted census tracts, stops that were associated with any form of stop other than a vehicular stop, and stops that were repeats of the same stop instance but a recording of additional persons in the same vehicle. Following this process, the final dataset was limited to ~570k stops. At this point, we aggregated the number of stops by census tracts, and then calculated our rates.

In order to ensure that our variables were ready for analysis, we had to log transform our dependent variables: stop rate, citation rate and search rate. Before the log transformation, the data was significantly right skewed. After transformation, the variables were more normally distributed and ready for incorporation into regression models.

Table I. Information on Variables Included in Regression Models

Methodology

This research has three segments or three methods which are utilized in order to triangulate and answers our two research questions: I) aggregate visualizations examining law enforcement rates by racial subpopulations in the City of Los Angeles, II) Getis-Ord Gi* Hot Spot analyses across the City of Los Angeles, and III) Spatial Lag Models (SLM) across our dependent variables. The first method consists of generating aggregate law enforcement rates by racial subpopulation to find general nonspatial disparity in representation in law enforcement outcomes accounting for population size, the second method is to conduct Getis-Ord Gi* Hot Spot Analyses to find clustering of certain law enforcement outcomes across the City of Los Angeles, and the third method is to utilize a spatial regression approach to fine the ‘neighborhood’ level factors that are most associated with law enforcement outcomes––while accounting for spatial dependence which could make our models biased or inaccurate under the scenario that we fail to account for them. The following segments will quickly review the hot spot analyses and the spatial lag models.

Getis-Ord Gi Hot Spot Analysis*

This study runs Getis-Ord Gi* hot spot analyses across different geographic regions, in order to determine where exactly law enforcement stops, citations, and searches are predominantly spatially concentrated across our jurisdiction. The Gi* method is a local measure of spatial autocorrelation method which determines whether or not there is clustering of low or high values across the site of study. The process essentially transforms the value of interest into a z-score and then, using the spatial weights matrix, determines whether or not there is local spatial clustering of higher or lower values, as compared to the aggregate mean. The equation for this process is established below, taken from Livings, Wu (2020):

Model I. Getis-Ord Gi Model for Stops, Citations and Search Neighborhood Clustering*

The hot spot analysis then determines whether or not there are hot spots or cold spots within the region. Moreover, this process returns valid results that can be hypothesis tested through a utilization of the z-scores and p-values (Livings, Wu, 2020). The final product of the hot spot analysis is then a visualization of the hot spots and cold spots associated with a given value, at varying different shades which correlate to their representation within the standard confidence interval range.

Spatial Lag Models

Next, we’re interested in finding the associations between different neighborhood level factors and the stop, citation and search rates across our geographies of interest. In deploying the Spatial Lag Model (SLM), we control for spatial autocorrelation of the dependent variable within space. In order to carry out this regression, we create W, a spatial weights matrix of the neighborhood structure of our given geographies of interest, and we also include p, which is a weight for the dependent variable or error term’s impact on a given geographic units’ outcome values (Getis, 2009). The spatial weights matrix we construct is specifically a first order Rook’s contiguity formation that is row standardized, which marks a given areal unit a weight of 1 if its borders is touching with another areal unit, and then marks a given areal unit a weight of 0 if it doesn’t share the aforementioned first order contiguity. We account for spatial dependence in this instance, because the literature has shown that law enforcement stops, and police killings, are geographically concentrated in some communities, and not in others. Policing is deployed using spatial technologies, and so accounting for that direct spatial application of police resources allows for the accounting of such spatial concentrations and produces more accurate coefficients. The standard Ordinary Least Squares (OLS) model is often made inefficient or biased in the presence of spatial autocorrelation, due to the violation of the Independent Unit Assumption. In accounting for the violation of the independent unit assumption, this model more readily and accurately accounts for the neighborhood level dynamics which are most related to the classification of stops, citations and searches, and the neighborhood level factors that are associated with their occurrence. In the following mathematical representation, the Spatial Lag Model(s) are estimated across census tracts in the City of Los Angeles (Lesage, Pace, 2009):

Model II. Spatial Lag Model(s) for Stop & Citation Neighborhood Associations

where y denotes the dependent variables (stop rate and citation rate), α denotes a constant, Xβ denotes a vector of explanatory variables, ρWy denotes the spatial weights matrix and the lagged dependent variable, and ε denotes the error term, which is independent but not normally distributed through space (Lesage, Pace, 2009; Chi, Zhu, 2019). The benefits of the SLM is that it accounts for the way in which geographic units are spatially dependent, which is a problem of using regression models that don’t account for the spatial interactions often associated with regional data (Elhorst, 2010). Due to the fact that the spatially lagged dependent variable––or the weighted average of a given geographic units’ neighboring dependent variable values––cannot merely be interpreted as another independent variable in the model, and the fact that its inclusion into the model makes interpretation of the explanatory variable coefficients more complex, it is necessary to run an impact analysis.

In regards to diagnostics more generally, the research process also takes into account the problems of heteroskedasticity, multicollinearity, and spatial dependence of the residuals. Heteroskedasticity was tested for using the Breusch-Pagan test. The study failed to reject the Null hypothesis of homoskedasticity. Multicollinearity was accounted for using the VIF tests, and specifically noting VIFs > 5. To avoid multi-collinearity, this model dropped bachelor’s degree or higher % from the models, and therefore from the entire dataset, as it isn’t included here or in Table I in the Data section. The research also tested for spatial dependence of the model residuals using the Monte-Carlo Moran’s I tests (N = 1,000) on the residuals from the initial and exploratory Ordinary Least Squares (OLS) models, and following the incorporation of the Spatial Lag Models (SLM), the residuals were retested using the Monte-Carlo Moran’s I. The OLS models suffered from positive spatial dependence of the residuals at a statistically significant level, while the SLM models showed no evidence of negative or positive spatial autocorrelation.

Results

Aggregates of Various Law Enforcement Rates by Population
To begin, the study presents the aggregate visualization of law enforcement stop rates, citations and searches across the City of Los Angeles. The visualization specifically represents the law enforcement outcome by 10,000 residents across Black, Latinx, White and Asian motorists. They rate was calculated by findings the total number of stopped, cited, and searched drivers that were able to be geocoded and spatially joined to the included census tracts within the site of study, divided by the aggregation of racial subpopulations across the included census tracts within the site of study. The data comes from 1-year of data, and it’s limited to census tracts with a population > 500, and excluding census tracts such as UCLA, Griffith Park, LAX and Dodgers Stadium.

Figure II. Aggregate Law Enforcement Outcome Rates by Racial Subpopulations in Los Angeles

The largest finding is that Black folks are most overpoliced and far more overpoliced than other racial populations across the city, and that Latinx drivers are also more likely to be stopped and searched relative to White and Asian folks. Specifically, this analysis reveals that Black folks are 4x more likely to be stopped, 3x more likely to be cited, and 12x more likely to be searched than White people, relative to their population size. On the other hand, Latinx folks are 1.4x more likely to be stopped, and 3x more likely to be searched than White people, relative to their population size. On the other hand, White and Asian drivers are least policed across the law enforcement outcomes present in this analysis: stop rates, citation rates and search rates.

For the purpose of this study, this visualization reveals the sharp racial disparity across law enforcement outcomes. Specifically, though, this work reveals the way in which racial profiling in law enforcement outcomes related to a higher degree of citations––or ticketting––of Black folks. Racial profiling in stops upstream, wherein Black folks are 4x overrepresented in stops compared to White folks, is related to a higher degree of citations for Black folks. Next, this study will examine the geographic concentration of law enforcement outcomes in the City of Los Angeles.

Getis-Ord Gi* Hot Spot Analysis

In utilizing the Gi* methods, it’s possible to display pockets of high degrees or low degree of law enforcement outcomes across the City of Los Angeles. The previous visualization displayed the racial disparity across racial subpopulations, but didn’t address the factor of where those outcomes were concentrated in the city, related to the racio-demographic context of the city. Below, we visualize both the racial demographic distribution across the City of Los Angeles, as well as Gi* hot spot maps across the three law enforcement outcomes included in the study.

Figure III. Racio-Demographic Distribution in the City of Los Angeles

Figure IV. Hot Spot Analysis of Law Enforcement Outcomes in the City of Los Angeles

The largest findings from this analysis is that high search rates are clustered in South LA, which is a predominantly Black and Latinx geography; after this, stop rates seem to be clustered somewhat in South LA, and citations seem to have the fewest hot spots in South LA. Across all hot Gi* maps, there seems to be hot spots in the DTLA area, which may be related to the higher population in that region of the city. Moreover, the maps find that there are significant cold spots in search rates in West Los Angeles and parts of the western segment of the San Fernando Valley. What the search rate map demonstrates is that while predominantly poor and Black/Latinx South LA has a huge segment of its terrain marked by hot spots for search rates, the predominantly affluent and White West LA has cold spots for searches. While citations don’t seem to be clustered within South LA, they are clustered in areas like DTLA, Central LA (Harvard Heights and Pico-Union), as well as in Venice, Hollywood, Beverly Grove, and Fairfax (uncovered by the researcher using OpenStreetsMap as a interactive leaflet map underneath the Gi* maps).

Spatial Lag Models

Lastly, this paper is interested in finding the associations between different neighborhood level factors and the stop, citation and search rates across Los Angeles. The regression table for the Spatial Lag Models (SLMs) are below, as well as their impacts which demonstrate the direct, indirect and total effects for each independent variable. (The direct and indirect effect effect numbers record whether the coefficient of a given variable is more associated with neighboring geographic units’ independent values [or indirect effects], or the reference geographic unit’s values [or direct effects]). Lasage & Pace (2009) note that including impacts are important for interpreting the coefficients of models such as the Spatial Durbin Model (SDM) and the Spatial Lag Model (SLM)––and that failing to do so might otherwise results in a misinterpretation of the coefficients of the variables of interest in one’s regression model(s).

Table II. Spatial Lag Regressions for Law Enforcement Outcomes in the City of Los Angeles

Table III. Impacts for Stop Rate SLM in the City of Los Angeles

Table IV. Impacts for Citation Rate SLM in the City of Los Angeles

Table V. Impacts for Search Rate SLM in the City of Los Angeles

The largest finding from these results is that there are positive associations for Black and Latinx populations across stops and searches. This means that as a census tracts’ share or Black residents increases, or as a census tracts’ share of Latinx residents increases, there is an increase in the rate of residents stopped, as well as an increase in the rate of residents searched––controlling for other variables. Furthermore, the analysis reveals that poverty rate is also positively associated with all three law enforcement rates included in the study. There are, furthermore, negative associations with the women population share of a tract, as well as the renter household share of a tract.

The impact analysis reveals the direct effects and indirect effects entailed across our independent variables. The impact results for stops and citations leads to an interesting finding: while there is a negative association with renter household share and stop rate and citation rate, it appears that this negative association is due to the indirect effect of the average share of census tracts’ around an individual geography. How does this work in practice? We might read it as such: the negative association with renter household share and stop/citation rates are related to a given tract’s neighbors and their share of renter households, and not necessarily strongly related to the renter household share of a reference tract. It seems that there’s an indirect suppressive effect related to renter household share––at least when controlling for other variables. Another interesting findings is related to how the direct and indirect effects of poverty rate change across the citation and search rate models. While both models have a positive association with poverty rate, it appears that citation rates have a large indirect effect, while poverty rate has a large direct effect.

In turning to the Akaike Information Criterion (AIC) analysis, which allows us to see the goodness of fit across our different models, or the degree to which a model describes the actual data generating process, it’s apparent that the search model is the most predictive, while the stop and citation models trail in their efficacy. The AIC for the search rate model is 2,085; the AIC for the stop rate model is 2,380; and the AIC for the citation rate model is 2,828. Another factor related to evaluating these AICs is that the different dependent variable may hinder the use of the AIC to compare across the models, but in running OLS models prior to the Spatial Lag Models and observing the relative different of adjusted R^2, it seems that the level of fit across models carries over with the AIC figures. Why might the search model be more predictive while the citation model may be less predictive? If this result is viewed in context with the Getis-Ord Gi* analysis, then we might understand the difference of fit across these dependent variables. The search rate hot spot analysis showed a strong clustering of hot spots in South LA, which is a Black-Latinx geography; on the other hand, the citation rate model showed very minimal and the least amount of clustering across the whole city, in relation to the other dependent variable maps. While we know that racial profiling occurs and impacts Black drivers predominantly, and Latinx drivers significantly as well––these findings allow us to see that citation disparity may have a larger disparity at the level of the individual/body, and not at the geographic aggregate. On the other hand, our findings reveal that search rates have both a disparity at the scale of the individual, as well as a disparity at the scale of the geographic aggregate.

(as noted in the methods section, these models accounted for multicollinearity, heteroskedasticity, and the spatial dependence of the residuals from prior nonspatial regressions.)

Discussion

What are the implications for this research? First, this research points towards racial disparities across all three of the dependent variables of interest: (vehicular) stops, citations and searches. The analysis also uncovered that stops and searches are positively associated with the share of black and latinx residents of an area. Lastly, we uncovered that while disparities in searches occur at the level of the body and the geographic aggregate, we found that disparities in citations occur especially at the level of the body but not necessarily at the level of the geographic aggregate (or minimally so at this level of aggregation). More so, this research focuses especially on the relation between these variables, but also especially how law enforcement stops generate an undue economic burden on Black residents due to fine farming, or the disparate levying of tickets on Black motorists caused by racial profiling. While these findings are novel, their implications are even more significant. In this particular historical context, following the police killings of Black folks in the last decade and in relation to the Black Lives Matter movement, this work points towards the ways in which law enforcement institutions don’t secure public safety as much as they work to secure racial differences, violence, and economic sanctions in low-income communities and upon low-income bodies of color.

The research can be expanded with future work. First, the study only contains one year of data––so future work should expand this analysis to multiple years, potentially even using spatial panel sets to make the findings more robust. Second, these findings are contingent on the validity of the methods in which law enforcement officers record valid data that are in line with the standards of the Racial and Identity Profiling Act (RIPA) of 2015. In connection with this, it must be remembered that the racial classifications of drivers which this study relies on, is contingent on the perceptions of officers and how they record drivers. Third, we geocoded ~670k stops but our conversation success rate was only somewhere in the 80-85% range––future research should improve cleaning of addresses and geocoding technology in order to increase the success rate of geocoding. Fourth, when referring to the preliminary OLS models, we find that the adjusted R^2 values were either moderate or low for stops (~.25) and citations (~.13). Future models should include more omitted variables, like dummy variables for highways intersecting with particular tracts, or interaction with highway intersections and a larger population of black and latinx residents.

Conclusion

This research answered the research questions first framed at the beginning of this work. They are as follows: I) Are law enforcement stops and outcomes (eg. citations and searches) clustered in particular communities across Los Angeles? , and II) What are the neighborhood factors most associated with these stop and outcome (eg. citation and search) incidences in Los Angeles? The answer to the first question is that all outcomes are clustered generally in downtown Los Angeles (DTLA) as well as Hollywood and Venice more generally; moreover, searches are particularly clustered in South LA, which is a predominantly Black-Latinx geography. The answer to the second question is that poverty, latinx population share of the area, and black population share of the area is most positively associated with the three different law enforcement stops, and then women population share of the area and renter household share of the area are negatively associated with the law enforcement outcomes analyzed in this study (stops, citations and searches).

This study reveals that law enforcement and traffic enforcement are a vector for inequality. Black and Latinx drivers are most subjected to very large disparities in stops and searches that are caused by racial profiling. Moreover, Black drivers specifically are subjected disproportionately to large disparities in citation rates, which can be viewed as a negative economic sanction that impacts a population that is less affluent. Previous studies have lifted up the importance of viewing police as a form of State violence (Wacquant, 2008; Wang, 2018), and this study contributes to that literature, pointing towards the interrelation of stops, citation and searches, and the material-economic disparities entailed in the search process.

References

Chi, G., Zhu, J. (2019). Spatial Regression Models for the Social Sciences. Thousand Oaks, CA: SAGE Publications.

Collins, C., Stuart, F., & Janulis, P. (2022). Policing gentrification or policing displacement? Testing the relationship between order maintenance policing and neighbourhood change in Los Angeles. Urban Studies (Edinburgh, Scotland), 59(2), 414–433. https://doi.org/10.1177/0042098021993354

Elhorst, J.P. 2010. “Applied spatial econometrics: Raising the bar.” Spatial Economic Analysis, 5(1): 9-28.

Getis, A. (2009). “Spatial Weights Matrices.” Geographical Analysis, 41(4), 404-410.

LeSage, J.P., and R.K. Pace. (2009). Introduction to Spatial Econometrics. Boca Raton, FL: CRC Press.

Livings, M. and A. Wu, 2020. “Local measures of spatial association.” The Geographic Information Science & Technology Body of Knowledge (3rd Quarter 2020 Edition), John P. Wilson (Ed.)

Maksuta, K. D. (2021). Exploring Group-Threat and Police-Involved Homicide: A Spatial Analysis of Police Involved Homicide in US Counties (Order No. 28649886). ProQuest Dissertations & Theses Global; ProQuest One Academic. https://www.proquest.com/docview/2571026761?fromopenview=true&parentSessionId=zNaWvQmxtNda0OUIgd6l7UXbGn3JWBKqZ84lralz%2FiM%3D&pq-origsite=gscholar&accountid=14749

Meng, Y. (2017). Profiling Minorities: Police Stop and Search Practices in Toronto, Canada. Human Geographies, 11(1), 5-23. doi http://dx.doi.org/10.5719/hgeo.2017.111.1

Pierson, E., Simoiu, C., Overgoor, J., Corbett-Davies, S., Jenson, D., Shoemaker, A., Ramachandran, V., Barghouty, P., Phillips, C., Shroff, R., & Goel, S. (2020). A large-scale analysis of racial disparities in police stops across the United States. Nature Human Behaviour, 4(7), 736–745. https://doi.org/10.1038/s41562-020-0858-1

Poston, B., Chang, C. (2019). LAPD searches blacks and Latinos more. But they’re less likely to have contraband than whites. The Los Angeles Times. https://www.latimes.com/local/lanow/ la-me-lapd-searches-20190605-story.html

Public Records Request City of Los Angeles. (2019) Request #19-7467. https://lacity.nextrequest.com/requests/19-7467

Racial and Identity Profiling Advisory Board. (2019). Annual Report 2019. https://oag.ca.gov/sites/all/files/agweb/pdfs/ripa/ripa-board-report-2019.pdf

Ross, C. T. (2015). A multi-level Bayesian analysis of racial Bias in police shootings at the county-level in the United States, 2011-2014. PloS One, 10(11), e0141854–e0141854. https://doi.org/10.1371/journal.pone.0141854

Wacquant, L. (2008). Urban Outcasts: A Comparative Sociology of Advanced Marginality. Polity Press.

Wang, J. (2018). Carceral Capitalism. Semiotexte.

LS0tCnRpdGxlOiAiUmFjaWFsIFByb2ZpbGluZyBpbiBWZWhpY3VsYXIgU3RvcHMgJiBPdXRjb21lcyBpbiB0aGUgQ2l0eSBvZiBMb3MgQW5nZWxlcyIKYXV0aG9yOiAKLSAiSm9zaHVhIENhbnRvbmcgKihoZS90aGVtKSogfCBVU0MgTWFzdGVyIG9mIFB1YmxpYyBQb2xpY3ksIFVyYmFuIFNwYXRpYWwgQW5hbHlzaXMiCi0gIlNwYXRpYWwgRWNvbm9tZXRyaWNzIChTU0NJIDU3NCkgLSBTcHJpbmcgMjAyMiIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OiBkZWZhdWx0CiAgZ2l0aHViX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKCiMjICoqKkludHJvZHVjdGlvbioqKgoKUG9saWNlIHN0b3BzIGFyZSB0aGUgbWlsaWV1IG9mIHB1YmxpYyB2aW9sZW5jZSBhdCB0aGUgaGFuZHMgb2YgYSBzby1jYWxsZWQgY29sbGVjdGlvbiBvZiAqcHVibGljIHNlcnZhbnRzKi4gVGhlIHN0b3AgaXMgdGhlIG1pbGlldeKAk+KAk3RoZSBzaXR1YXRpb25hbCwgYW5kIHJlbGF0aW9uYWwgc3BhY2XigJPigJN3aGVyZWJ5IGJlYXRpbmdzLCBoYXJhc3NtZW50LCBhbmQga2lsbGluZ3MgYXJlIGxldmllZCB1cG9uIGJsYWNrIGZvbGtzIGRpc3Byb3BvcnRpb25hdGVseSwgYW5kIHByZWRvbWluYW50bHkgbG93ZXItaW5jb21lIGJsYWNrIGZvbGssIGluIHRoZSBBbWVyaWNhbiBNZXRyb3BvbGlzLCBhcyB3ZWxsIGFzIGl0cyBtdWx0aXBsaWNpdG91cyBleHVyYnMsIGFuZCBydXJhbCBsYW5kcy4gTXVjaCBlbXBpcmljYWwgcmVzZWFyY2ggd2l0aCBhIHN0cmVhbSBvZiBsYXJnZSBhZG1pbmlzdHJhdGl2ZSBkYXRhIGZyb20gcG9saWNpbmcgaW5zdGl0dXRpb25zIG92ZXIgdGhlIGxhc3QgMjAteWVhcnMgaGF2ZSBjb25maXJtZWQgd2hhdCBibGFjayBmb2xrcyBoYXZlIGtub3duIHNpbmNlIHRoZSBlYXJseSAyMHRoLWNlbnR1cnkgKG9yIG1heWJlIGV2ZW4gc2luY2UgdGhlIGVuZCBvZiBSZWNvbnN0cnVjdGlvbik6IHRoYXQgcG9saWNpbmcgaXMgYW4gaW5zdGl0dXRpb24gd2hpY2ggaXMgZGlzcHJvcG9ydGlvbmF0ZWx5IGxldmllZCB1cG9uIGJsYWNrIGJlaW5ncyBhbmQgYmxhY2sgZ2VvZ3JhcGhpZXMgaW4gYSB3YXkgdGhhdCBhZmZlY3RzIHRoZSBibGFjayBiZWluZyBhbmQgZ2VvZ3JhcGh5IG5lZ2F0aXZlbHkgYWNyb3NzIGEgdmFyaWV0eSBvZiBhY2NvdW50YWJsZSBkb21haW5zLiBWaW9sZW5jZSBpcyB0aGUgbW9zdCB2aXNpYmxlLCBncm90ZXNxdWUgYW5kIGZvcmNlZnVsIGZvcm0gb2YgcG9saWNlIGludGVyYWN0aW9uIHdpdGggbG93LWluY29tZSBjb21tdW5pdGllcyBvZiBjb2xvcuKAk+KAk2l04oCZcyB0cnVlIHRoYXQgcG9saWNlIHRoZW1zZWx2ZXMgYXJlIHRoZSBtb3N0IHZpc2libGUgYW5kIGVtYm9kaWVkIGZvcm0gb2YgYSBTdGF0ZSB0aGF0IGhhcyBuZWdsZWN0ZWQsIGRpc2ludmVzdGVkIGFuZCBzdGlnbWF0aXplZCBibGFjayBmb2xrcyBhbmQgYmxhY2sgZ2VvZ3JhcGhpZXMgdGhyb3VnaG91dCBoaXN0b3J5IChXYWNxdWFudCwgMjAwOCnigJPigJNidXQgZG9lcyB0aGUgbmVnYXRpdmUgc3RyYXRpZmljYXRpb24gaW52b2x2ZWQgaW4gdGhlIHBvbGljaW5nIGluc3RpdHV0aW9uIGVuZCBhdCBlbWJvZGllZCB2dWxuZXJhYmlsaXR5IGFuZCB0aGUgbG9zcyBvZiBsaWZlIGVudGFpbGVkIGluIHBoeXNpY2FsIHZpb2xlbmNlLCBvciBtaWdodCBpdCBleHRlbmQgYW5kIGNvYWxlc2NlIHdpdGggbWF0ZXJpYWwgYW5kIHZhbHVlZCBmb3JtcyBvZiBpbmVxdWFsaXR5PyBXaGF0IGFyZSB0aGUgZWNvbm9taWMgaW1wYWN0cyBvZiByYWNpYWwgcHJvZmlsaW5nIGluIGxhdyBlbmZvcmNlbWVudCBzdG9wc+KAk+KAk2FuZCBob3cgbWlnaHQgdGhhdCBiZSBhIHBhcnQgb2YgYSBsYXJnZXIgc2NoZW1hIG9mIHBvbGljaW5nIGFzIGFuIGFwcGFyYXR1cyBlbnRhaWxlZCB3aXRoaW4gcmFjaWFsIGNhcGl0YWxpc3Qgb3JkZXJpbmdzIG9mIGRpZmZlcmVuY2U/CgpNb3JlIHJlc2VhcmNoIG92ZXIgdGhlIGxhc3QgZGVjYWRlIG9yIHNvIGhhcyBiZWd1biB0byBmb2N1cyBvbiB0aGUgZWNvbm9taWMgaW1wYWN0cyBvZiBzdG9wcywgYW5kIHRoZSB3YXkgdGhhdCBibGFjayBmb2xrcyBhcmUgbW9zdCBsaWtlbHkgdG8gYmUgc3ViamVjdGVkIHRvIGVjb25vbWljIGV4dHJhY3Rpb24gZnJvbSB0aGUgaGFuZHMgb2YgdGhlIHBvbGljaW5nIGluc3RpdHV0aW9uLiBIb3cgZG9lcyB0aGlzIHdvcms/ICpNdW5pY2lwYWwgZmluZSBmYXJtaW5nKiBpcyBhIG1ldGhvZCB0aGF0IHBvbGljaW5nIGluc3RpdHV0aW9ucyB1c2UgdG8gZXh0cmFjdCBmaXNjYWwgcmVzb3VyY2VzIGZyb20gcG9vciBmb2xrcywgYW5kIHBvb3IgZm9sa3Mgb2YgY29sb3LigJPigJNpdOKAmXMgYSBtZXRob2Qgd2hlcmVpbiB0aGUgY2l0eSBwb2xpY2UgdXNlIHRoZWlyIHBvd2VyIG9mIGxldnlpbmcgdGlja2V0cyB0byByYWlzZSBmaXNjYWwgcmVzb3VyY2VzIGZvciBhIGdpdmVuIG11bmljaXBhbGl0eSB0aGF04oCZcyB2eWluZyBmb3IgYW4gZXhwYW5kZWQgYnVkZ2V0OyBhcyBvcHBvc2VkIHRvIHBlb3BsZSBiZWluZyB0aWNrZXRlZCBvciBjaXRlZCBmb3IgYWN0dWFsIG1vdmluZyB2aW9sYXRpb25zLCB0aGV5IGFyZSBpbnN0ZWFkIGNpdGVkIGJlY2F1c2UgdGhlIFN0YXRlIHVuanVzdGx5IHNhbmN0aW9ucyB0aGVtIGZvciB0aGVpciByYWNlLCBhbmQgdXNlcyB0aGVtIGFzIGEgd2F5IHRvIGV4cGFuZCB0aGUgZmlzY2FsIGV4dGVudCBvZiB0aGUgbG9jYWwgZ292ZXJubWVudCAoV2FuZywgMjAxOCkuIFRoaXMgY3VycmVudCBzdHVkeSBzZWVrcyB0byBleHRlbmQgdGhlIGxpdGVyYXR1cmUgb24gdGhlIGVjb25vbWljIHZpb2xlbmNlIGFuZCByYWNpby1ldGhuaWMgc2FuY3Rpb25pbmcgZW50YWlsZWQgaW4gdGhlIHBvbGljaW5nIGluc3RpdHV0aW9uLCBieSBmb2N1c2luZyBvbiB0aGUgcXVlc3Rpb24gb2YgaG93IGxhdyBlbmZvcmNlbWVudCBzdG9wcywgY2l0YXRpb25zLCBhbmQgc2VhcmNoIHJhdGVzIGFyZSBpbnRlcnR3aW5lZCBpbiBhIHBhcnRpY3VsYXIgQW1lcmljYW4gTWV0cm9wb2xpczogdGhlIENpdHkgb2YgTG9zIEFuZ2VsZXMuIAoKVGhlIHJlc2VhcmNoIHF1ZXN0aW9ucyBmb3IgdGhpcyBwcm9qZWN0IGFyZSBiZWxvdzogCgo+IEFyZSBsYXcgZW5mb3JjZW1lbnQgc3RvcHMgYW5kIG91dGNvbWVzIChlZy4gY2l0YXRpb25zIGFuZCBzZWFyY2hlcykgY2x1c3RlcmVkIGluIHBhcnRpY3VsYXIgY29tbXVuaXRpZXMgYWNyb3NzIExvcyBBbmdlbGVzPyAKCj4gV2hhdCBhcmUgdGhlIG5laWdoYm9yaG9vZCBmYWN0b3JzIG1vc3QgYXNzb2NpYXRlZCB3aXRoIHRoZXNlIHN0b3AgYW5kIG91dGNvbWUgKGVnLiBjaXRhdGlvbiBhbmQgc2VhcmNoKSBpbmNpZGVuY2VzIGluIExvcyBBbmdlbGVzPwoKCiMjIyMjICoqRmlndXJlIEkuIFNoYXBlZmlsZSBvZiB0aGUgQ2l0eSBvZiBMb3MgQW5nZWxlcyoqCmBgYHtyIHByZXNzdXJlLCBlY2hvPUZBTFNFLCBmaWcuY2FwPSJTaGFwZmlsZSBmcm9tIHRoZSBDaXR5IG9mIExvcyBBbmdlbGVzLiBFeGNsdWRlcyB0cmFjdHMgd2l0aCBhIHBvcHVsYXRpb24gPiA1MDAsIGFzIHdlbGwgYXMgYW5vbWFseSB0cmFjdHMgdGhhdCB3b3VsZCBjcmVhdGUgb3V0bGllcnMgaW4gcmVzdWx0cyAoTEFYLCBHcmlmZml0aCBQYXJrLCBEb2RnZXIgU3RhZGl1bSwgVUNMQSwgZXRjLikifQoKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9qb3NodWFjYW50b25nL0Rlc2t0b3AvQWNhZGVtaWNzL1NwcmluZyAyMDIyL1NTQ0kgNTc0L1Byb2dyYW1taW5nL1Jlc3VsdHMvbGEgY2l0eSBzaGFwZWZpbGUucG5nIikKCmBgYAoKCgoKCiMjICoqKkJhY2tncm91bmQqKioKT3RoZXIgc3R1ZGllcyBpbiB0aGUgc29jaWFsIHNjaWVuY2VzIGhhdmUgc291Z2h0IHRvIHF1YW50aXRhdGl2ZWx5IHVuY292ZXIgdGhlIHJhY2lhbCBkaXNwYXJpdGllcyBwcmVzZW50IGFjcm9zcyBkaWZmZXJlbnQgcG9saWNpbmcgb3BlcmF0aW9uczogc29tZSBmb2N1cyBvbiBwb2xpY2Uga2lsbGluZ3MsIHNvbWUgZm9jdXMgb24gc3RvcHMgYW5kIHNlYXJjaGVzLCBhbmQgZmV3ZXIgZm9jdXMgb24gdGhlIGVjb25vbWljIGV4dHJhY3Rpb24gZW50YWlsZWQgaW4gZGlzcHJvcG9ydGlvbmF0ZSBjaXRhdGlvbiBsZXZ5aW5nIChNYWtzdXRhLCAyMDIxOyBNZW5nLCAyMDE3OyBQaWVyc29uIGV0IGFsLiwgMjAyMCkuIEluIHRoZSBsaXRlcmF0dXJlLCB0aGVyZSBoYXZlIGJlZW4gdmVyeSBmZXcgcGFwZXJzIHRoYXQgcnVuIGluZmVyZW50aWFsIGFuYWx5c2lzIG9mIHBvbGljaW5nIG9wZXJhdGlvbnMgd2hpbGUgdGFraW5nIGludG8gYWNjb3VudCB0aGUgcXVlc3Rpb24gb2Ygc3BhY2U6IGVpdGhlciB0aHJvdWdoIGNhcnRvZ3JhcGhpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BhdGlhbCBkaXN0cmlidXRpb24gb2YgcG9saWNlIGFzc29jaWF0ZWQgb3V0Y29tZXMsIG9yIG9mIGV4cGxpY2l0IHJlZ3Jlc3Npb24gbW9kZWxzIHRoYXQgYWNjb3VudCBmb3Igc3BhdGlhbCBoZXRlcm9nZW5laXR5IGFuZCBzcGF0aWFsIGRlcGVuZGVuY2UuIEluIHRoZSBsaXRlcmF0dXJlLCBpdCBzZWVtcyBhcyBpZiBhIGNvdXBsZSBvZiB0aGUgbW9zdCBjb21tb24gbWV0aG9kb2xvZ2llcyB0aGF0IGFyZSB1c2VkIG1vc3Qgb2Z0ZW7igJPigJNzb21ld2hhdCByZWxhdGVkIHRvIHRoZSBub24tc3BhdGlhbCBkYXRhIGxpbWl0YXRpb25zIGVudGFpbGVkIGluIG1vc3QgbGFyZ2UgYWRtaW5pc3RyYXRpdmUgcG9saWNpbmcgZGF0YeKAk+KAk2luIHBvbGljaW5nIHJlc2VhcmNoIGZvY3VzZWQgb24gcmFjaWFsIGRpc3Bhcml0eSwgYXJlIG9mdGVuIHRoZSAqdGhyZXNob2xkIHRlc3QqIGFuZCB0aGUgKnZlaWwgb2YgZGFya25lc3MgdGVzdCouIFRoZSBmaXJzdCB0ZXN0IHVzZXMgaGl0IHJhdGVzICh0aGUgcmF0ZSBhdCB3aGljaCBhIG1vdG9yaXN0cyBzdG9wcGVkIGlzIGZvdW5kIHdpdGggZHJ1Z3MsIGNvbnRyYWJhbmQgb3Igd2VhcG9ucywgZXRjLikgYWdncmVnYXRlZCBhY3Jvc3MgcmFjaWFsIHN1YnBvcHVsYXRpb25zLCBjb21wYXJlZCB0byB0aGUgc2VhcmNoIHJhdGVzIGFjcm9zcyBhZ2dyZWdhdGVkIGFjcm9zcyByYWNpYWwgc3VicG9wdWxhdGlvbnMsIGluIG9yZGVyIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhIGNlcnRhaW4gcmFjaWFsIHN1YnBvcHVsYXRpb24gaXMgc2VhcmNoZWQgbW9yZSByZWxhdGl2ZSB0byB0aGVpciBoaXQgcmF0ZS4gVGhpcyBtZXRob2QgaGFzIGJlZW4gdXNlZCBieSB0aGUgU3RhbmZvcmQgT3BlbiBQb2xpY2luZyBQcm9qZWN0IGluIHBhcnRuZXJzaGlwIHdpdGggdGhlIExvcyBBbmdlbGVzIFRpbWVzLCBpbiBhIHN0dWR5IHRoYXQgaGFkIGEgbGFyZ2UgaW1wYWN0IG9uIHRoZSBwdWJsaWMgYW5kIHBvbGl0aWNhbCBzcGFjZXPigJkgcGVyY2VwdGlvbiBvZiBwb2xpY2luZyBwcmFjdGljZXMgaW4gTG9zIEFuZ2VsZXMsIGluIHRoZSBzZWNvbmQgZGVjYWRlIG9mIHRoZSAyMHRoIGNlbnR1cnkgKFBvc3RvbiwgQ2hhbmcsIDIwMTkpLiAKClRoZSBuZXh0IG1ldGhvZCBtZW50aW9uZWQgaXMgdGhlIHZlaWwgb2YgZGFya25lc3MgdGVzdDsgdGhpcyB0ZXN0IGlzIHVzZWQgb2Z0ZW4gaW4gY3JpbWluYWwgbGVnYWwgc3R1ZGllcyBiZWNhdXNlIGl04oCZcyB0aGUgbW9zdCBwb3B1bGF0IGNhdXNhbCB0ZXN0IHRvIGRldGVybWluZSByYWNpYWwgcHJvZmlsaW5nIGluIGxhdyBlbmZvcmNlbWVudCBzdG9wIHByYWN0aWNlcyAoUmFjaWFsIGFuZCBJZGVudGl0eSBQcm9maWxpbmcgQWR2aXNvcnkgQm9hcmQsIDIwMTkpLiBUaGUgdGVzdCBlc3NlbnRpYWxseSBjb21wYXJlcyBzdG9wIHJhdGVzIGFjcm9zcyByYWNpYWwgc3VicG9wdWxhdGlvbnMgaW4gYSBnaXZlbiB0aW1lIHNwYW4gYmVmb3JlIHN1bmRvd24sIHRvIHRoZSBzdG9wIHJhdGVzIGZvciB0aGUgYXNzb2NpYXRlZCByYWNpYWwgc3VicG9wdWxhdGlvbnMgYWZ0ZXIgc3VuZG93bjsgd2l0aCB0aGUgZ29hbCBvZiBpZGVudGlmeWluZyB3aGV0aGVyIHRoZSBsYWNrIG9mIHN1bmxpZ2h0IG1pZ2h0IHNlcnZlIGFzIHNvbWUgbmF0dXJhbCBleG9nZW5vdXMgZmFjdG9yIHRoYXQgbWlnaHQgbGVhZCB0byBhIHJlZHVjdGlvbiBpbiByYWNpYWwgcHJvZmlsaW5nLCBhbmQgdGhlcmVieSBleHByZXNzIGRpZmZlcmVudCBpbiBzdG9wIHJhdGVzIGFjcm9zcyByYWNpYWwgc3VicG9wdWxhdGlvbnMgdGhhdCBhcmUgcmV2ZWFsZWQgd2l0aCBkaWZmZXJlbmNlcyBvciBpbWJhbGFuY2VzIGluIHN0b3AgcmF0ZXMgYm90aCBpbnRlcm5hbC10ZW1wb3JhbGx5ICh3aXRoaW4gYSBnaXZlbiByYWNpYWwgc3VicG9wdWxhdGlvbikgYW5kIGFsc28gaW1iYWxhbmNlcyBpbiBjb21wYXJpc29uIChhY3Jvc3MgYSBzZXQgb2YgZ2l2ZW4gcmFjaWFsIHN1YnBvcHVsYXRpb25zKS4gVGhlIGFzc3VtcHRpb24gd2l0aCB0aGUgdmVpbCBvZiBkYXJrbmVzcyBpcyB0aGF0IGFuIG9mZmljZXIgY2Fubm90IGRldGVybWluZSB0aGUgcmFjZSBvZiBhIGRyaXZlciBhZnRlciBzdW5kb3duOyB0aGlzIGFzc3VtcHRpb24gbWF5IGJlIGhhcmQgdG8gZXN0YWJsaXNoLiBNb3Jlb3ZlciwgdGhlIHRlc3QgaXMgYWxzbyBhc3BhdGlhbCBhbmQgYWdncmVnYXRlZCBzdG9wIHJhdGVzIGJ5IHJhY2lhbCBzdWJwb3B1bGF0aW9uIG5vdCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBhcmVhIG9mIHRoZSBjaXR5IHdoZXJlIHRoZSBzdG9wcyBvY2N1cnJlZCwgYW5kIHdoYXQgdGhlIG5laWdoYm9yaG9vZCBjb25kaXRpb25zIHdlcmUgb2YgdGhlIHN0b3BzIHRoYXQgb2NjdXJyZWTigJPigJN0aGlzIHRlc3QgYXNzdW1lcyB0aGF0IGFuIG9mZmljZXIgd291bGRu4oCZdCBleHBlY3Qgb3IgYXNzdW1lIGEgZHJpdmVyIGluIGEgcGVyY2VwdGl2ZWx5IHBvb3IgY2FyIGluIGEgcHJlZG9taW5hbnRseSBibGFjayBhcmVhIHRvIGJlIGEgYmxhY2sgZHJpdmVyLCBtZXJlbHkgYmVjYXVzZSB0aGUgc3VuIGhhcyBnb25lIGRvd24uIFRoaXMgaXMgYSBzdHJvbmcgYXNzdW1wdGlvbiBhbmQgaXQgbWlnaHQgYmUgbm90ZWQgdGhhdCB0aGUgdmVpbCBvZiBkYXJrbmVzcyB0ZXN0IGRlbWFuZHMgYSBzZXJpZXMgb2YgYXNzdW1wdGlvbnMgdGhhdCBhcmUgaGFyZCB0byBob2xkIHdpdGhpbiByZWFsaXR54oCT4oCTdGhpcyBtYXkgZXNwZWNpYWxseSBiZSB0aGUgY2FzZSB3aXRoIHNtYWxsZXIgZGF0YXNldHMgdGhhdCBkb27igJl0IGhhdmUgYSBsYXJnZSBlbm91Z2ggc2FtcGxlIHNpemUgdG8gYXZlcmFnZSBvdXQgdGhlIHJlc3VsdHMgYWNyb3NzIGdlb2dyYXBoaWVzIGFuZCBhY3Jvc3MgdGltZS4gVGhpcyBzdHVkeSBleHByZXNzIGFuIG92ZXJ2aWV3IG9mIHRoZXNlIHRlc3RzIGluIG9yZGVyIHRvIGxheSBvdXQgd2hhdCB0aGUgZmllbGQgaGFzIGNvbW1vbmx5IGRvbmUgd2hlbiBleGFtaW5pbmcgcmFjaWFsIHByb2ZpbGluZyBpbiBsYXcgZW5mb3JjZW1lbnQgc3RvcHMsIGFuZCB0byBleHByZXNzIHNvbWUgb2YgdGhlaXIgbGltaXRhdGlvbnMuIAoKVGhlcmUgYXJlIHRocmVlIHBhcGVycyB0aGF0IHRoaXMgd29yayBidWlsZHMgdXBvbi4gVGhlIGZpcnN0IGlzIGEgc3R1ZHkgb2YgcG9saWNpbmcga2lsbGluZ3MgdXNpbmcgc3BhdGlhbCByZWdyZXNzaW9uIG1vZGVscywgdGhlIG5leHQgaXMgYSBzdHVkeSBhbmFseXppbmcgc3RvcCBhbmQgc2VhcmNoIHJhdGVzIHVzaW5nIGEgcGFuZWwgZGF0YSBzZXQgd2l0aCBkZXNjcmlwdGl2ZSBhbmQgY2FydG9ncmFwaGljIGFuYWx5c2VzLCBhbmQgdGhlIGxhc3QgaXMgYSBzdHVkeSB3aGljaCBhbmFseXplcyAyME0gc3RvcHMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIHVzZXMgdGhlIHZlaWwgb2YgZGFya25lc3MgYW5kIHRocmVzaG9sZCB0ZXN0cyB0byBkZXRlcm1pbmUgcmFjaWFsIGRpc3Bhcml0eSBpbiBsYXcgZW5mb3JjZW1lbnQgc3RvcHMgYW5kIHNlYXJjaGVzLiAKClRoZSBmaXJzdCBpcyBhIHBhcGVyIGZyb20gTWFrc3V0YSAoMjAyMSkgd2hpY2ggdXNlcyBkYXRhIGZyb20gdGhlIE1hcHBpbmcgUG9saWNlIFZpb2xlbmNlIChNUFYpIGRhdGFiYXNlLCB3aGljaCBoYXMgYXJvdW5kIDEwSyByZWNvcmRlZCBwb2xpY2Uga2lsbGluZ3MgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgdXNpbmcgY3Jvd2Rzb3VyY2VkIGRhdGEgZnJvbSBmb2xrcyBvbiB0aGUgZ3JvdW5kLiBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHBvbGljZSBkb27igJl0IGFjY3VyYXRlbHkgcmVjb3JkIGRhdGEgb24gdGhlIHBlb3BsZSB0aGV5IGtpbGwsIGFuZCBzbyBpZiBhbnkgcmVzZWFyY2ggcmVsaWVzIG9uIHRoZSBpbnRlcm5hbCByZWNvcmRzIGZyb20gcG9saWNpbmcgaW5zdGl0dXRpb25zIHRvIGlucXVpcmUgYWJvdXQgdGhlc2Uga2lsbGluZ3MsIHRoZW4gdGhlIHF1YWxpdHkgb2YgdGhlIGRhdGEgaXRzZWxmIHdvdWxkIHByZXZlbnQgYSByZWFsIGFuYWx5c2lzIG9mIHJhY2lhbCBkaXNwYXJpdHkgYW5kIGdlb2dyYXBoaWMgZGlzcGFyaXR5IGluIHBvbGljZSBraWxsaW5ncy4gV2hpbGUgdGhpcyBpcyBhbiBhcnRpY2xlIHdob3NlIGRlcGVuZGVudCB2YXJpYWJsZSBpcyBkaXN0aW5jdCBmcm9tIHRoZSBvbmUgZW50YWlsZWQgaW4gdGhpcyBwYXBlcuKAk+KAk3RoZSBhdXRob3IgZXhhbWluZXMgcG9saWNlIGtpbGxpbmdzIGFnZ3JlZ2F0ZWQgYXQgdGhlIGNvdW50eSBsZXZlbCBhY3Jvc3MgdGhlIGVudGlyZSBjb3VudHJ5LCB3aGlsZSB0aGUgY3VycmVudCBwYXBlciBleGFtaW5lcyBwb2xpY2Ugc3RvcCByYXRlcywgY2l0YXRpb24gcmF0ZXMsIGFuZCBzZWFyY2ggcmF0ZXMgYWdncmVnYXRlZCBhdCB0aGUgY2Vuc3VzIHRyYWN0IGxldmVsIGluIGEgc2luZ2xlIGNpdHnigJPigJN0aGVyZSBpcyBzdGlsbCBhbiBvdmVybGFwIGJvdGggd2l0aCBtZXRob2RvbG9neSBhcyB3ZWxsIGFzIHdpdGggdGhlIGRvbWFpbiBvZiBpbnRlcmVzdC4gVGhlIGF1dGhvciB1c2VzIGEgU3BhdGlhbCBEdXJiaW4gTW9kZWwgKFNETSksIHdoaWNoIHRha2VzIGludG8gYWNjb3VudCBib3RoIHNwYXRpYWwgZGVwZW5kZW5jZSBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLCB3aGlsZSBhbHNvIHRha2luZyBpbnRvIGFjY291bnQgc3BhdGlhbCBkZXBlbmRlbmNlIHdoaWNoIGlzIHJlbGF0ZWQgdG8gdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBpbmNsdWRlZCBpbiBhIG1vZGVsIChvciBhIHN1YnNldCBvZiBpbmRlcGVuZGVudCB2YXJpYWJsZXMgaW5jbHVkZWQgaW4gdGhlIG1vZGVsKS4gSW4gdGhlIHdvcmssIHRoZSBhdXRob3IgZGVzY3JpYmVzIHRoZSByZWxhdGl2ZSBiZW5lZml0IG9mIHV0aWxpemluZyBzcGF0aWFsIGVjb25vbWV0cmljIG1vZGVscyBmb3IgcmVnaW9uYWwgYW5hbHlzaXMgZm9yIHRoaXMgcHVycG9zZSwgYmVjYXVzZSB0aGUgYmFzaWMgT3JkaW5hcnkgTGVhc3QgU3F1YXJlcyAoT0xTKSBtb2RlbCwgb3Igb3RoZXIgbW9kZWxz4oCT4oCTbmVnYXRpdmUgYmlub21pYWwsIGZvciBpbnN0YW5jZeKAk+KAk21heSB1c2UgcmVnaW9uYWwgb3IgZ2VvZ3JhcGhpYyB1bml0cyB3aGlsZSBicmVha2luZyB0aGUgYXNzdW1wdGlvbnMgb2YgcmFuZG9tIGFzc29jaWF0aW9uIGR1ZSB0byBzcGF0aWFsIGF1dG9jb3JyZWxhdGlvbiwgd2hpY2ggd291bGQgYmlhcywgb3IgYXQgdGhlIHZlcnkgbGVhc3QgYmUg4oCYaW5hcHByb3ByaWF0ZeKAmSBmb3IgdGhlIG1vZGVsIGVzdGltYXRpb24uIEluIHJlZ2FyZCB0byB0aGVpciBmaW5kaW5ncywgdGhlIGF1dGhvciBub3RlZCB0aGF0IHBvbGljZS1pbnZvbHZlZCBob21pY2lkZXMgKFBJSCkgYXJlIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIGEgY291bnR54oCZcyBjb25jZW50cmF0ZWQgZGlzYWR2YW50YWdlIGFuZCBHaW5pIGNvZWZmaWNpZW50IChhIG1ldHJpYyBvZiBlY29ub21pYyBpbmVxdWFsaXR5KSwgd2hpbGUgYWxzbyBiZWluZyByZWxhdGVkIChpbmRpcmVjdGx5KSB0byB0aGUgY3JpbWUgcmF0ZSBvZiB0aGUgcmVzcGVjdGl2ZSBjb3VudHkuIFRoaXMgc3R1ZHkgaXMgaW1wb3J0YW50IGJlY2F1c2UgaXQgdW5jb3ZlcnMgdGhlIGZhY3QgdGhhdCBwb2xpY2Uga2lsbGluZ3MgaGF2ZSBhIHZlcnkgaW50ZW5zaXZlIHJlbGF0aW9uc2hpcCB3aXRoIGRpc2FkdmFudGFnZWQgZ2VvZ3JhcGhpZXMuIFdoaWxlIHRoZSBzdHVkeSBpcyBicm9hZCBpbiBpdHMgc2NvcGUsIHRoZSBzdHVkeSBtYXkgaGF2ZSBiZWVuIGJlbmVmaXRlZCBieSBydW5uaW5nIG11bHRpLWxldmVsIGxpbmVhciByZWdyZXNzaW9ucyB0aGF0IHdvdWxkIGhhdmUgdGFrZW4gaW50byBhY2NvdW50IHRoZSBwb2xpY2Uga2lsbGluZyByYXRlcyBvZiBjaXRpZXMgd2l0aGluIGNvdW50aWVzLCBvciBvZiByZWdpb25zIG9mIHRoZSBVbml0ZWQgU3RhdGVzIGFzIGNvbXBhcmVkIHRvIG90aGVycy4gVGhpcyB3b3VsZCBoYXZlIGFsbG93ZWQgdGhlIHBhcGVyIHRvIGJlIG1vcmUgZ3JhbnVsYXIgaW4gaXRzIGFuYWx5c2lzIG9mIHRoZSBpbnRlcm5hbCBoZXRlcm9nZW5laXR5IHRoYXQgaXMgcHJlc2VudCB3aXRoaW4gY291bnRpZXMsIHdoaWNoIGFyZSBxdWl0ZSBhIGxhcmdlIHNwYXRpYWwgdW5pdCB0byBiZSB1c2VkIHRvIGFuYWx5emUgZGlzcGFyaXR5IGluIHBvbGljZSBraWxsaW5ncy4gIAoKVGhlIG5leHQgcGFwZXIgdGhhdCB0aGlzIHN0dWR5IGJ1aWxkcyBvZmYgb2YgaXMgYSBzdHVkeSBieSBNZW5nICgyMDE3KSB3aGljaCB1c2VzIGRhdGEgZnJvbSB0aGUgVG9yb250byBQb2xpY2UgU2VydmljZSB0byBpbnZlc3RpZ2F0ZSByYWNpYWwgZGlzcGFyaXR5IGluIHN0b3BzIGFuZCBzZWFyY2hlcy4gVGhlIGF1dGhvciB1c2VzIFRvcm9udG8sIENhbmFkYSwgYXMgYSByZWdpb24gb2YgdGhlaXIgYW5hbHlzaXMsIGFuZCB0aGV5IHV0aWxpemUgYSBkYXRhc2V0IHRoYXQgZXh0ZW5kcyBvdmVyIGEgZGVjYWRlLiBXaGlsZSB0aGlzIGFydGljbGUgZG9lc27igJl0IG5lY2Vzc2FyaWx5IGV4YW1pbmUgcG9saWNpbmcgdGhyb3VnaCBhIGxlbnMgdGhhdCBpbmNvcnBvcmF0ZXMgYSByZWdyZXNzaW9uLWJhc2VkIHNwYXRpYWwgYW5hbHlzaXMgKFNMTSwgU0VNLCBTRE0sIGV0Yy4pLCB0aGUgYXV0aG9yIGRvZXMgZ2VuZXJhdGUgdGhlaXIgd29yayB0aHJvdWdoIGEgc3BhdGlhbCBmcmFtZS4gVGhleSBydW4gZGVzY3JpcHRpdmUgc3RhdGlzdGljcyB0aGF0IHBvaW50IHRvd2FyZHMgZGlzcGFyYXRlIHJhdGlvcyBvZiBzdG9wIHJhdGVzIGZvciBibGFjayBhbmQgd2hpdGUgeW91dGggaW4gdGhlIGNpdHksIGFuZCB0aGVuIHRoZXkgYWxzbyBub3RlIHRoZSBjbHVzdGVyaW5nIG9mIHRoaXMgZGlzcGFyaXR5IGluIHBhcnRpY3VsYXIgZ2VvZ3JhcGhpZXMgaW4gdGhlaXIgc2l0ZSBvZiBzdHVkeS4gVGhlaXIgZmluZGluZ3MsIGFzIGhpbnRlZCB0b3dhcmRzIHByaW9yLCBlc3RhYmxpc2hlcyB0aGF0IHBvbGljZSBkaXNwcm9wb3J0aW9uYXRlbHkgZGlyZWN0IHRoZWlyIGZvcmNlcyBhZ2FpbnN0IGJsYWNrIHlvdXRoIChpZS4gZ28gYWJvdXQgcGVyZm9ybWluZyByYWNpYWwgcHJvZmlsaW5nIGluc3RhbmNlcyksIGFuZCB0aGF0IHRoaXMgcGVyZm9ybWFuY2UgaXMgZGlyZWN0ZWQgZGlzcHJvcG9ydGlvbmF0ZWx5IGluIGFyZWFzIHRoYXQgaGF2ZSBoaWdoZXIgd2hpdGUgcG9wdWxhdGlvbnMgYW5kIGFyZWFzIHRoYXQgaGF2ZSBoaWdoZXIgY3JpbWUgcmF0ZXMuIFRoZSBhdXRob3JzIHBvaW50IHRvd2FyZHMgdGhlIG5lZWQgZm9yIGEgZ3JlYXRlciBkZW1vY3JhdGl6YXRpb24gb2YgZGF0YSwgcmVndWxhciBhZG1pbmlzdHJhdGl2ZSByZXZpZXcgYmFzZWQgb24gc3RvcCBkYXRhLCBhbmQgY29tbXVuaXR5IHBvbGljaW5nLiBXaGlsZSB0aGUgbGF0dGVyIHJlY29tbWVuZGF0aW9uIG1heSBiZSBzcGVjaW91cywgYW5kIGdlbmVyYXRlZCBpbiBhIHByZS1GbG95ZCBmcmFtaW5nIGNlbnRlcmVkIGluIHRoZSBmZWFzaWJpbGl0eSBvciBob3BlIHdpdGhpbiBwb2xpY2UgcmVmb3JtaXNtLCB0aGlzIHdvcmsgaXMgbm90ZWQgZ2VuZXJhbGx5IGZvciBpdHMgc3BhdGlhbCBmcmFtaW5nIGFuZCBmb2N1cyBvbiBkaXNhZ2dyZWdhdGluZyB0aGUgaW1wYWN0IG9mIHBvbGljaW5nIGluIGFuIGFnZS11bml2ZXJzYWxpemVkIGNvbnRleHQsIGFuZCBzcGVjaWZpY2FsbHkgZm9jdXNpbmcgb24gaG93IHJhY2lhbGx5IHRhcmdldGVkIHBvbGljZSBwcmFjdGljZXMgaW1wYWN0IHlvdXRoIGluIGxvd2VyLWluY29tZSBjb21tdW5pdGllcyBvZiBjb2xvci4gCgpUaGUgbGFzdCBhcnRpY2xlIHRoYXQgdGhpcyBzdHVkeSBtZW50aW9ucyBpcyBwcm9iYWJseSB0aGUgbW9zdCBleHBhbnNpdmUgYW5hbHlzaXMgb2YgcmFjaWFsIHByb2ZpbGluZyBhbmQgZGlzYXByaXR5IGluIHBvbGljZSBpbnRlcmFjdGlvbnMgd2l0aCBjaXZpbGlhbnMgaW4gbGF3IGVuZm9yY2VtZW50IHN0b3BzLCBhbmQgdGhlIHBhcGVyIGNhbWUgb3V0IG9mIHRoZSBOWVUgQ2VudGVyIGZvciBVcmJhbiBTY2llbmNlIGFuZCBQcm9ncmVzcyAoQ1VTUCksIGFzIHdlbGwgYXMgdGhlIFN0YW5mb3JkIE9wZW4gUG9saWNpbmcgUHJvamVjdCAoT1BQKSAoUGllcnNvbiBldCBhbC4sIDIwMjApLiBUaGUgcGFwZXIgdXNlZCB0aGUgYWZvcmVtZW50aW9uZWQgYXNwYXRpYWwgbWV0aG9kcyB1c2VkIHRvIGRldGVybWluZSByYWNpYWwgcHJvZmlsaW5nIGluIHN0b3BzIGFuZCBzZWFyY2hlczogcmVzcGVjdGl2ZWx5IHRoZSB2ZWlsIG9mIGRhcmtuZXNzIHRlc3QgYW5kIHRoZSB0aHJlc2hvbGQgdGVzdHMuIEluIGFuIGFuYWx5c2lzIG9mIDEwME0gc3RvcHMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgb3ZlciBuZWFybHkgMTAteWVhcnMsIHRoZSBhdXRob3JzIGZvdW5kIHRoYXQgYmxhY2sgZm9sa3Mgd2VyZSBsZXNzIGxpa2VseSB0byBiZSBzdG9wcGVkIGFmdGVyIHN1bnNldOKAk+KAk2xlYWRpbmcgdG8gdGhlIGltcGxpY2F0aW9uIHRoYXQgb2ZmaWNlcnMgYXJlIGxlc3MgbGlrZWx5IHRvIHN0b3AgZHJpdmVycyBhbmQgcmFjaWFsbHkgcHJvZmlsZSB0aGVtIGR1ZSB0byBtZXJlbHkgdGhlIGxvc3Mgb2YgaW5mb3JtYXRpb24gY2F1c2VkIGJ5IHJlZHVjdGlvbiBpbiBwZXJjZWl2aW5nIHJhY2UgYXQgbmlnaHQsIGFuZCBhbHRlcm5hdGl2ZWx5LCBtb3JlIGxpa2VseSB0byBzdG9wIGJsYWNrIGRyaXZlcnMgZGlzcHJvcG9ydGlvbmF0ZWx5IGR1ZSB0byB0aGUgbWVhbnMgb2YgcGVyY2VpdmluZyB0aGVpciByYWNlLiBJbiB0aGVpciB3b3Jkczog4oCcV2UgZm91bmQgdGhhdCBibGFjayBkcml2ZXJzIHdlcmUgbGVzcyBsaWtlbHkgdG8gYmUgc3RvcHBlZCBhZnRlciBzdW5zZXQsIHdoZW4gYSDigJh2ZWlsIG9mIGRhcmtuZXNz4oCZIG1hc2tzIG9uZeKAmXMgcmFjZSwgc3VnZ2VzdGluZyBiaWFzIGluIHN0b3AgZGVjaXNpb25z4oCdIChQaWVyc29uIGV0IGFsLiwgMjAyMCkuIEZ1cnRoZXJtb3JlLCB0aGVpciB2ZWlsIG9mIGRhcmtuZXNzIHRlc3RzIGFsc28gZm91bmQgdGhhdCB0aGVyZSB3YXMgYSBsb3dlciBzdGFuZGFyZCBvZiB2ZWhpY3VsYXIgb3IgcGVyc29uIHNlYXJjaGVzIGZvciBibGFjayBhbmQgbGF0aW54IGRyaXZlcnMuIFRoaXMgZXNzZW50aWFsbHkgbWVhbnMgdGhhdCBhbHRob3VnaCBibGFjayBhbmQgbGF0aW54IGRyaXZlcnMgaGF2ZSBzaW1pbGFyIGhpdCByYXRlcyAocmF0ZXMgYXQgd2hpY2ggZHJ1Z3Mgb3IgY29udHJhYmFuZCBhcmUgZm91bmQgaW4gdGhlIHByb2Nlc3Mgb2YgdGhlIHNlYXJjaCkgdG8gd2hpdGUgZm9sa3MsIGJ1dCB0aGV5IGhhdmUgc2lnbmlmaWNhbnRseSBoaWdoZXIgc2VhcmNoIHJhdGVzLCBlcXVhdGluZyB0byBhbiBpbmVxdWFsaXR5IGluIHRoZSBkZWdyZWUgdG8gd2hpY2ggcG9saWNlIGxldnkgdGhlaXIgc2VhcmNoIHBvd2VyIHVuanVzdGx5IHVwb24gdGhlc2UgcG9wdWxhdGlvbnMuIFRoaXMgc3R1ZHkgaXMgdmVyeSBpbXBvcnRhbmNlIGJlY2F1c2Ugb2YgdGhlIGFtYml0aW9uIG9mIGl0cyBzY29wZTogcG9saWNpbmcgZGF0YSBoYXMgYmVlbiBpbmZhbW91c2x5IHNwYXJzZSBhY3Jvc3MgdGhlIG5hdGlvbiBkdWUgdG8gdGhlIHdheSBpbiB3aGljaCBwb2xpY2luZyBpbnN0aXR1dGlvbnMgaGF2ZSBiZWVuIGhpc3RvcmljYWxseSBkaXNpbmNsaW5lZCBhdCBjb2xsZWN0aW5nIGFuZCBwdWJsaXNoaW5nIGFjY3VyYXRlIGRhdGEgb24gdGhlaXIgcmFjaWFsIHRhcmdldGluZyBwcmFjdGljZXPigJPigJN0aGlzIHN0dWR5IG5vdCBtZXJlbHkgY29sbGVjdHMgZGF0YSBmcm9tIGFjcm9zcyB0aGUgbmF0aW9uLCBidXQgaXQgYWxzbyBjb2xsZWN0cyBhIHBhbmVsIGRhdGEgc2V0IHdoaWNoIGluY2x1ZGVzIGFsbW9zdCBhIGRlY2FkZSBvZiBkYXRhLiBBIGxpbWl0YXRpb24gd2l0aCB0aGlzIHN0dWR5IGlzIHRoYXQgaXQgZG9lc27igJl0IGFuYWx5emUgdGhlIHByb2JsZW0gb2YgcG9saWNpbmcgYW5kIHJhY2lhbCBwcm9maWxpbmcgdGhyb3VnaCBhIHNwYXRpYWwgZnJhbWUsIGV2ZW4gdGhvdWdoIHdlIGtub3cgdGhhdCBwb2xpY2luZyBpbnN0aXR1dGlvbnMgdXNlIG1hcHBpbmcgcGxhdGZvcm1zIGFuZCB0ZWNobm9sb2dpZXMgdG8gb3JpZW50IHRoZSB3YXkgdGhleSBkZXBsb3kgdGhlaXIgcmVzb3VyY2VzIGluIHJhY2lvLWdlb2dyYXBoaWNhbGx5IGRpc3BhcmF0ZSB3YXlzLCBhbmQgZXZlbiB0aG91Z2ggd2Uga25vdyB0aGF0IHRoZXJlZm9yZSBwb2xpY2UgcHJhY3RpY2VzIGhhdmUgZm9ybXMgb2YgaW5lcXVhbGl0eSB0aGF0IHJlbGF0ZSB0byBwYXJ0aWN1bGFyIGJlaW5ncyBhbmQgYm9kaWVzLCBidXQgYWxzbyBjb21tdW5pdGllcyBhbmQgcmFjaWFsIGdlb2dyYXBoaWVzLiAKCkluIGxpZ2h0IG9mIHRoaXMgYnJvYWQgbGl0ZXJhdHVyZSwgd2l0aCBpdHMgY29tbWVuc3VyYXRlIGFuZCBleHRhbnQgbGltaXRhdGlvbnMsIHRoaXMgc3R1ZHkgc2Vla3MgdG8gbWFrZSBhIHNtYWxsIGNvbnRyaWJ1dGlvbiB0byB0aGUgc3R1ZHkgb2YgcG9saWNlIHByYWN0aWNlcyBhbmQgcmFjaWFsbHkgZGlzcGFyYXRlIGVmZmVjdHMgYnkgYW5hbHl6aW5nIHRoZSBpbnRlcnJlbGF0aW9uIHdpdGggc3RvcHMsIGNpdGF0aW9ucyBhbmQgc2VhcmNoZXMsIGluIGEgd2F5IHRoYXQgcHJpb3JpdGl6ZXMgYW4gYW5hbHlzaXMgdGhhdCBjZW50ZXJzIHRoZSBpbXBvcnRhbmNlIG9mIHRoZSBtYXRlcmlhbC1lY29ub21pYyBlZmZlY3RzIGFzc29jaWF0ZWQgd2l0aCByYWNpYWwgcHJvZmlsaW5nLCB3aGlsZSBhbHNvIGFkZHJlc3NpbmcgdGhlIHF1ZXN0aW9uIG9mIHNwYWNlIGluIGEgcm9idXN0IG1hbm5lci4gCgoKIyMgKioqRGF0YSoqKgpPdXIgZGF0YXNldCBpcyBtYWRlIHVwIGZyb20gdGhyZWUgcHJlZG9taW5hbnQgc291cmNlczogSSkgQ2FsaWZvcm5pYSBQdWJsaWMgUmVjb3JkcyBBY3QgKFBSQSkgcmVxdWVzdCBkYXRhIGZyb20gdGhlIExvcyBBbmdlbGVzIFBvbGljZSBEZXBhcnRtZW50IChMQVBEKSBmb3IgbGF3IGVuZm9yY2VtZW50IHN0b3AgZGF0YSBpbiAyMDE5IHdpdGggYWRkaXRpb25hbCBhZGRyZXNzZXMgaW5jbHVkZWQsIHdoaWNoIGFsbG93ZWQgdGhpcyBzdHVkeSB0byBnZW9jb2RlIGFuZCBydW4gc3BhdGlhbCBwcm9jZXNzZXMgb24gdGhlIGRhdGEgKEl04oCZcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoaXMgd29yayB3YXMgc3VwcG9ydGVkIGJ5IFNQVVIsIGEgcmVzZWFyY2ggaW5zdGl0dXRlIGluIENhbGlmb3JuaWHigJlzIEJheSBBcmVhLCBhbmQgdGhhdCB0aGlzIHdvcmsgaXMgYSBwYXJ0aWFsIGJ1dCBsaW1pdGVkIHByb2R1Y3Qgb2YgYSBsYXJnZXIgc2VwYXJhdGUgcHJhY3RpY3VtIGFzc2lnbm1lbnQgY29uZHVjdGVkIGZvciBTUFVSLCBpbiBwYXJ0IG9mIFVTQ+KAmXMgTWFzdGVyIG9mIFB1YmxpYyBQb2xpY3kgcHJvZ3JhbS4pIChQdWJsaWMgUmVjb3JkcyBSZXF1ZXN0IENpdHkgb2YgTG9zIEFuZ2VsZXMsIDIwMTkpOyBJSSkgYSByYW5nZSBvZiBzb2Npby1kZW1vZ3JhcGhpYyBhbmQgc29jaW8tZWNvbm9taWMgdmFyaWFibGVzIHRpZWQgdG8gY2Vuc3VzIHRyYWN0cyB3aGljaCBjb21lIGZyb20gdGhlIFUuUy4gQ2Vuc3VzIEJ1cmVhdeKAmXMgQW1lcmljYW4gQ29tbXVuaXR5IFN1cnZleSA1LVllYXIgRXN0aW1hdGVz4oCT4oCTdGhlc2UgdmFyaWFibGVzIGFyZSBsaXN0ZWQgaW4gVGFibGUgSSBiZWxvdywgYnV0IGluY2x1ZGUgcmFjaWFsIGRlbW9ncmFwaGljcywgaW5jb21lIGluZXF1YWxpdHksIGdlbmRlciBkZW1vZ3JhcGhpY3MsIHBvdmVydHksIGFuZCB0ZW51cmUgdHlwZTsgYW5kIElJSSkgYSBzaGFwZWZpbGUgZm9yIHRoZSBDaXR5IG9mIExvcyBBbmdlbGVzIHdoaWNoIHdhcyB0YWtlbiBmcm9tIHRoZSBMQSBPcGVuIERhdGEgUG9ydGFsLiAgIAoKVGhlIHN0dWR5IGRyb3BwZWQgY2Vuc3VzIHRyYWN0cyB0aGF0IGhhZCBhIGxpbWl0ZWQgcG9wdWxhdGlvbiBzaXplICh4IDwgNTAwKSBvciBvdGhlciBhbm9tYWxpZXMsIGJlY2F1c2UgdGhlc2Ugb3V0bGllciBjYWxjdWxhdGlvbnMgd291bGTigJl2ZSBza2V3ZWQgcmVncmVzc2lvbiByZXN1bHRzIGluIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgdmFyaWVkIGxhdyBlbmZvcmNlbWVudCBvdXRjb21lIGRlcGVuZGVudCB2YXJpYWJsZXMgdXRpbGl6ZWQgaW4gdGhpcyBzdHVkeS4gU29tZSBleGFtcGxlcyBvZiBjZW5zdXMgdHJhY3RzIHRoYXQgd2VyZSBkcm9wcGVkIGluY2x1ZGVkIHRob3NlIHdoaWNoIGhlbGQgVUNMQSwgTEFYLCBHcmlmZml0aCBQYXJrIGFuZCB0aGUgTEEgRG9kZ2VycyBTdGFkaXVtIChDb2xsaW5zLCBTdHVhcnQsIEphbnVsaXMsIDIwMjIpLiBJbiB0YWtpbmcgYSBsYXJnZXIgc3RlcCBiYWNrLCB0aGVyZSB3ZXJlIH43MDlrIHN0b3BzIHRoYXQgdGhlIExvcyBBbmdlbGVzIFBvbGljZSBEZXBhcnRtZW50IGNvbmR1Y3RlZCBpbiAyMDE5LiBUaGUgcHJlc2VudCBhbmFseXNpcyB3YXMgYWJsZSB0byBzdWNjZXNzZnVsbHkgZ2VvY29kZSB+NjkwayBzdG9wcy4gSW4gZnVydGhlciBsaW1pdGluZyB0aGUgZGF0YSwgd2UgcmVtb3ZlZCBzdG9wcyB0aGF0IGxpZWQgb3V0c2lkZSBvZiB0aGUgTEFQRCBjZW5zdXMgdHJhY3RzLCBvdXRzaWRlIG9mIHRoZSBwcmV2aW91c2x5IHN1YnNldHRlZCBjZW5zdXMgdHJhY3RzLCBzdG9wcyB0aGF0IHdlcmUgYXNzb2NpYXRlZCB3aXRoIGFueSBmb3JtIG9mIHN0b3Agb3RoZXIgdGhhbiBhIHZlaGljdWxhciBzdG9wLCBhbmQgc3RvcHMgdGhhdCB3ZXJlIHJlcGVhdHMgb2YgdGhlIHNhbWUgc3RvcCBpbnN0YW5jZSBidXQgYSByZWNvcmRpbmcgb2YgYWRkaXRpb25hbCBwZXJzb25zIGluIHRoZSBzYW1lIHZlaGljbGUuIEZvbGxvd2luZyB0aGlzIHByb2Nlc3MsIHRoZSBmaW5hbCBkYXRhc2V0IHdhcyBsaW1pdGVkIHRvIH41NzBrIHN0b3BzLiBBdCB0aGlzIHBvaW50LCB3ZSBhZ2dyZWdhdGVkIHRoZSBudW1iZXIgb2Ygc3RvcHMgYnkgY2Vuc3VzIHRyYWN0cywgYW5kIHRoZW4gY2FsY3VsYXRlZCBvdXIgcmF0ZXMuCgpJbiBvcmRlciB0byBlbnN1cmUgdGhhdCBvdXIgdmFyaWFibGVzIHdlcmUgcmVhZHkgZm9yIGFuYWx5c2lzLCB3ZSBoYWQgdG8gbG9nIHRyYW5zZm9ybSBvdXIgZGVwZW5kZW50IHZhcmlhYmxlczogc3RvcCByYXRlLCBjaXRhdGlvbiByYXRlIGFuZCBzZWFyY2ggcmF0ZS4gQmVmb3JlIHRoZSBsb2cgdHJhbnNmb3JtYXRpb24sIHRoZSBkYXRhIHdhcyBzaWduaWZpY2FudGx5IHJpZ2h0IHNrZXdlZC4gQWZ0ZXIgdHJhbnNmb3JtYXRpb24sIHRoZSB2YXJpYWJsZXMgd2VyZSBtb3JlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFuZCByZWFkeSBmb3IgaW5jb3Jwb3JhdGlvbiBpbnRvIHJlZ3Jlc3Npb24gbW9kZWxzLiAKCiMjIyMjICoqVGFibGUgSS4gSW5mb3JtYXRpb24gb24gVmFyaWFibGVzIEluY2x1ZGVkIGluIFJlZ3Jlc3Npb24gTW9kZWxzKioKYGBge3IsIGVjaG89RkFMU0V9Cgprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2pvc2h1YWNhbnRvbmcvRGVza3RvcC9BY2FkZW1pY3MvU3ByaW5nIDIwMjIvU1NDSSA1NzQvUHJvZ3JhbW1pbmcvUmVzdWx0cy92YXJpYWJsZSB0YWJsZS5wbmciKQoKYGBgCgoKCiMjICoqKk1ldGhvZG9sb2d5KioqClRoaXMgcmVzZWFyY2ggaGFzIHRocmVlIHNlZ21lbnRzIG9yIHRocmVlIG1ldGhvZHMgd2hpY2ggYXJlIHV0aWxpemVkIGluIG9yZGVyIHRvIHRyaWFuZ3VsYXRlIGFuZCBhbnN3ZXJzIG91ciB0d28gcmVzZWFyY2ggcXVlc3Rpb25zOiBJKSBhZ2dyZWdhdGUgdmlzdWFsaXphdGlvbnMgZXhhbWluaW5nIGxhdyBlbmZvcmNlbWVudCByYXRlcyBieSByYWNpYWwgc3VicG9wdWxhdGlvbnMgaW4gdGhlIENpdHkgb2YgTG9zIEFuZ2VsZXMsIElJKSBHZXRpcy1PcmQgR2kqIEhvdCBTcG90IGFuYWx5c2VzIGFjcm9zcyB0aGUgQ2l0eSBvZiBMb3MgQW5nZWxlcywgYW5kIElJSSkgU3BhdGlhbCBMYWcgTW9kZWxzIChTTE0pIGFjcm9zcyBvdXIgZGVwZW5kZW50IHZhcmlhYmxlcy4gVGhlIGZpcnN0IG1ldGhvZCBjb25zaXN0cyBvZiBnZW5lcmF0aW5nIGFnZ3JlZ2F0ZSBsYXcgZW5mb3JjZW1lbnQgcmF0ZXMgYnkgcmFjaWFsIHN1YnBvcHVsYXRpb24gdG8gZmluZCBnZW5lcmFsIG5vbnNwYXRpYWwgZGlzcGFyaXR5IGluIHJlcHJlc2VudGF0aW9uIGluIGxhdyBlbmZvcmNlbWVudCBvdXRjb21lcyBhY2NvdW50aW5nIGZvciBwb3B1bGF0aW9uIHNpemUsIHRoZSBzZWNvbmQgbWV0aG9kIGlzIHRvIGNvbmR1Y3QgR2V0aXMtT3JkIEdpKiBIb3QgU3BvdCBBbmFseXNlcyB0byBmaW5kIGNsdXN0ZXJpbmcgb2YgY2VydGFpbiBsYXcgZW5mb3JjZW1lbnQgb3V0Y29tZXMgYWNyb3NzIHRoZSBDaXR5IG9mIExvcyBBbmdlbGVzLCBhbmQgdGhlIHRoaXJkIG1ldGhvZCBpcyB0byB1dGlsaXplIGEgc3BhdGlhbCByZWdyZXNzaW9uIGFwcHJvYWNoIHRvIGZpbmUgdGhlIOKAmG5laWdoYm9yaG9vZOKAmSBsZXZlbCBmYWN0b3JzIHRoYXQgYXJlIG1vc3QgYXNzb2NpYXRlZCB3aXRoIGxhdyBlbmZvcmNlbWVudCBvdXRjb21lc+KAk+KAk3doaWxlIGFjY291bnRpbmcgZm9yIHNwYXRpYWwgZGVwZW5kZW5jZSB3aGljaCBjb3VsZCBtYWtlIG91ciBtb2RlbHMgYmlhc2VkIG9yIGluYWNjdXJhdGUgdW5kZXIgdGhlIHNjZW5hcmlvIHRoYXQgd2UgZmFpbCB0byBhY2NvdW50IGZvciB0aGVtLiBUaGUgZm9sbG93aW5nIHNlZ21lbnRzIHdpbGwgcXVpY2tseSByZXZpZXcgdGhlIGhvdCBzcG90IGFuYWx5c2VzIGFuZCB0aGUgc3BhdGlhbCBsYWcgbW9kZWxzLiAKCiMjIyMjICpHZXRpcy1PcmQgR2kqIEhvdCBTcG90IEFuYWx5c2lzKiAKVGhpcyBzdHVkeSBydW5zIEdldGlzLU9yZCBHaSogaG90IHNwb3QgYW5hbHlzZXMgYWNyb3NzIGRpZmZlcmVudCBnZW9ncmFwaGljIHJlZ2lvbnMsIGluIG9yZGVyIHRvIGRldGVybWluZSB3aGVyZSBleGFjdGx5IGxhdyBlbmZvcmNlbWVudCBzdG9wcywgY2l0YXRpb25zLCBhbmQgc2VhcmNoZXMgYXJlIHByZWRvbWluYW50bHkgc3BhdGlhbGx5IGNvbmNlbnRyYXRlZCBhY3Jvc3Mgb3VyIGp1cmlzZGljdGlvbi4gVGhlIEdpKiBtZXRob2QgaXMgYSBsb2NhbCBtZWFzdXJlIG9mIHNwYXRpYWwgYXV0b2NvcnJlbGF0aW9uIG1ldGhvZCB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGNsdXN0ZXJpbmcgb2YgbG93IG9yIGhpZ2ggdmFsdWVzIGFjcm9zcyB0aGUgc2l0ZSBvZiBzdHVkeS4gVGhlIHByb2Nlc3MgZXNzZW50aWFsbHkgdHJhbnNmb3JtcyB0aGUgdmFsdWUgb2YgaW50ZXJlc3QgaW50byBhIHotc2NvcmUgYW5kIHRoZW4sIHVzaW5nIHRoZSBzcGF0aWFsIHdlaWdodHMgbWF0cml4LCBkZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGxvY2FsIHNwYXRpYWwgY2x1c3RlcmluZyBvZiBoaWdoZXIgb3IgbG93ZXIgdmFsdWVzLCBhcyBjb21wYXJlZCB0byB0aGUgYWdncmVnYXRlIG1lYW4uIFRoZSBlcXVhdGlvbiBmb3IgdGhpcyBwcm9jZXNzIGlzIGVzdGFibGlzaGVkIGJlbG93LCB0YWtlbiBmcm9tIExpdmluZ3MsIFd1ICgyMDIwKTogCgo+ICMjIyMgKipNb2RlbCBJLioqICpHZXRpcy1PcmQgR2kqIE1vZGVsIGZvciBTdG9wcywgQ2l0YXRpb25zIGFuZCBTZWFyY2ggTmVpZ2hib3Job29kIENsdXN0ZXJpbmcqCgpgYGB7ciwgZWNobz1GQUxTRX0KCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvam9zaHVhY2FudG9uZy9EZXNrdG9wL0FjYWRlbWljcy9TcHJpbmcgMjAyMi9TU0NJIDU3NC9Qcm9ncmFtbWluZy9SZXN1bHRzL2dldGlzLW9yZCBtb2RlbCBmb3JtdWxhLnBuZyIpCgpgYGAKCgoKVGhlIGhvdCBzcG90IGFuYWx5c2lzIHRoZW4gZGV0ZXJtaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgaG90IHNwb3RzIG9yIGNvbGQgc3BvdHMgd2l0aGluIHRoZSByZWdpb24uIE1vcmVvdmVyLCB0aGlzIHByb2Nlc3MgcmV0dXJucyB2YWxpZCByZXN1bHRzIHRoYXQgY2FuIGJlIGh5cG90aGVzaXMgdGVzdGVkIHRocm91Z2ggYSB1dGlsaXphdGlvbiBvZiB0aGUgei1zY29yZXMgYW5kIHAtdmFsdWVzIChMaXZpbmdzLCBXdSwgMjAyMCkuIFRoZSBmaW5hbCBwcm9kdWN0IG9mIHRoZSBob3Qgc3BvdCBhbmFseXNpcyBpcyB0aGVuIGEgdmlzdWFsaXphdGlvbiBvZiB0aGUgaG90IHNwb3RzIGFuZCBjb2xkIHNwb3RzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHZhbHVlLCBhdCB2YXJ5aW5nIGRpZmZlcmVudCBzaGFkZXMgd2hpY2ggY29ycmVsYXRlIHRvIHRoZWlyIHJlcHJlc2VudGF0aW9uIHdpdGhpbiB0aGUgc3RhbmRhcmQgY29uZmlkZW5jZSBpbnRlcnZhbCByYW5nZS4gCgoKCiMjIyMjICpTcGF0aWFsIExhZyBNb2RlbHMqIApOZXh0LCB3ZeKAmXJlIGludGVyZXN0ZWQgaW4gZmluZGluZyB0aGUgYXNzb2NpYXRpb25zIGJldHdlZW4gZGlmZmVyZW50IG5laWdoYm9yaG9vZCBsZXZlbCBmYWN0b3JzIGFuZCB0aGUgc3RvcCwgY2l0YXRpb24gYW5kIHNlYXJjaCByYXRlcyBhY3Jvc3Mgb3VyIGdlb2dyYXBoaWVzIG9mIGludGVyZXN0LiBJbiBkZXBsb3lpbmcgdGhlIFNwYXRpYWwgTGFnIE1vZGVsIChTTE0pLCB3ZSBjb250cm9sIGZvciBzcGF0aWFsIGF1dG9jb3JyZWxhdGlvbiBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIHdpdGhpbiBzcGFjZS4gSW4gb3JkZXIgdG8gY2Fycnkgb3V0IHRoaXMgcmVncmVzc2lvbiwgd2UgY3JlYXRlIFcsIGEgc3BhdGlhbCB3ZWlnaHRzIG1hdHJpeCBvZiB0aGUgbmVpZ2hib3Job29kIHN0cnVjdHVyZSBvZiBvdXIgZ2l2ZW4gZ2VvZ3JhcGhpZXMgb2YgaW50ZXJlc3QsIGFuZCB3ZSBhbHNvIGluY2x1ZGUgcCwgd2hpY2ggaXMgYSB3ZWlnaHQgZm9yIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgb3IgZXJyb3IgdGVybeKAmXMgaW1wYWN0IG9uIGEgZ2l2ZW4gZ2VvZ3JhcGhpYyB1bml0c+KAmSBvdXRjb21lIHZhbHVlcyAoR2V0aXMsIDIwMDkpLiBUaGUgc3BhdGlhbCB3ZWlnaHRzIG1hdHJpeCB3ZSBjb25zdHJ1Y3QgaXMgc3BlY2lmaWNhbGx5IGEgZmlyc3Qgb3JkZXIgUm9va+KAmXMgY29udGlndWl0eSBmb3JtYXRpb24gdGhhdCBpcyByb3cgc3RhbmRhcmRpemVkLCB3aGljaCBtYXJrcyBhIGdpdmVuIGFyZWFsIHVuaXQgYSB3ZWlnaHQgb2YgMSBpZiBpdHMgYm9yZGVycyBpcyB0b3VjaGluZyB3aXRoIGFub3RoZXIgYXJlYWwgdW5pdCwgYW5kIHRoZW4gbWFya3MgYSBnaXZlbiBhcmVhbCB1bml0IGEgd2VpZ2h0IG9mIDAgaWYgaXQgZG9lc27igJl0IHNoYXJlIHRoZSBhZm9yZW1lbnRpb25lZCBmaXJzdCBvcmRlciBjb250aWd1aXR5LiBXZSBhY2NvdW50IGZvciBzcGF0aWFsIGRlcGVuZGVuY2UgaW4gdGhpcyBpbnN0YW5jZSwgYmVjYXVzZSB0aGUgbGl0ZXJhdHVyZSBoYXMgc2hvd24gdGhhdCBsYXcgZW5mb3JjZW1lbnQgc3RvcHMsIGFuZCBwb2xpY2Uga2lsbGluZ3MsIGFyZSBnZW9ncmFwaGljYWxseSBjb25jZW50cmF0ZWQgaW4gc29tZSBjb21tdW5pdGllcywgYW5kIG5vdCBpbiBvdGhlcnMuIFBvbGljaW5nIGlzIGRlcGxveWVkIHVzaW5nIHNwYXRpYWwgdGVjaG5vbG9naWVzLCBhbmQgc28gYWNjb3VudGluZyBmb3IgdGhhdCBkaXJlY3Qgc3BhdGlhbCBhcHBsaWNhdGlvbiBvZiBwb2xpY2UgcmVzb3VyY2VzIGFsbG93cyBmb3IgdGhlIGFjY291bnRpbmcgb2Ygc3VjaCBzcGF0aWFsIGNvbmNlbnRyYXRpb25zIGFuZCBwcm9kdWNlcyBtb3JlIGFjY3VyYXRlIGNvZWZmaWNpZW50cy4gVGhlIHN0YW5kYXJkIE9yZGluYXJ5IExlYXN0IFNxdWFyZXMgKE9MUykgbW9kZWwgaXMgb2Z0ZW4gbWFkZSBpbmVmZmljaWVudCBvciBiaWFzZWQgaW4gdGhlIHByZXNlbmNlIG9mIHNwYXRpYWwgYXV0b2NvcnJlbGF0aW9uLCBkdWUgdG8gdGhlIHZpb2xhdGlvbiBvZiB0aGUgSW5kZXBlbmRlbnQgVW5pdCBBc3N1bXB0aW9uLiBJbiBhY2NvdW50aW5nIGZvciB0aGUgdmlvbGF0aW9uIG9mIHRoZSBpbmRlcGVuZGVudCB1bml0IGFzc3VtcHRpb24sIHRoaXMgbW9kZWwgbW9yZSByZWFkaWx5IGFuZCBhY2N1cmF0ZWx5IGFjY291bnRzIGZvciB0aGUgbmVpZ2hib3Job29kIGxldmVsIGR5bmFtaWNzIHdoaWNoIGFyZSBtb3N0IHJlbGF0ZWQgdG8gdGhlIGNsYXNzaWZpY2F0aW9uIG9mIHN0b3BzLCBjaXRhdGlvbnMgYW5kIHNlYXJjaGVzLCBhbmQgdGhlIG5laWdoYm9yaG9vZCBsZXZlbCBmYWN0b3JzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGVpciBvY2N1cnJlbmNlLiBJbiB0aGUgZm9sbG93aW5nIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbiwgdGhlIFNwYXRpYWwgTGFnIE1vZGVsKHMpIGFyZSBlc3RpbWF0ZWQgYWNyb3NzIGNlbnN1cyB0cmFjdHMgaW4gdGhlIENpdHkgb2YgTG9zIEFuZ2VsZXMgKExlc2FnZSwgUGFjZSwgMjAwOSk6IAoKPiAjIyMjICoqTW9kZWwgSUkuKiogKlNwYXRpYWwgTGFnIE1vZGVsKHMpIGZvciBTdG9wICYgQ2l0YXRpb24gTmVpZ2hib3Job29kIEFzc29jaWF0aW9ucyogCgpgYGB7ciwgZWNobz1GQUxTRX0KCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvam9zaHVhY2FudG9uZy9EZXNrdG9wL0FjYWRlbWljcy9TcHJpbmcgMjAyMi9TU0NJIDU3NC9Qcm9ncmFtbWluZy9SZXN1bHRzL3NwYXRpYWwgbGFnIG1vZGVsIGZvcm11bGEucG5nIikKCmBgYAoKCgp3aGVyZSB5IGRlbm90ZXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZXMgKHN0b3AgcmF0ZSBhbmQgY2l0YXRpb24gcmF0ZSksIM6xIGRlbm90ZXMgYSBjb25zdGFudCwgWM6yIGRlbm90ZXMgYSB2ZWN0b3Igb2YgZXhwbGFuYXRvcnkgdmFyaWFibGVzLCDPgVd5IGRlbm90ZXMgdGhlIHNwYXRpYWwgd2VpZ2h0cyBtYXRyaXggYW5kIHRoZSBsYWdnZWQgZGVwZW5kZW50IHZhcmlhYmxlLCBhbmQgzrUgZGVub3RlcyB0aGUgZXJyb3IgdGVybSwgd2hpY2ggaXMgaW5kZXBlbmRlbnQgYnV0IG5vdCBub3JtYWxseSBkaXN0cmlidXRlZCB0aHJvdWdoIHNwYWNlIChMZXNhZ2UsIFBhY2UsIDIwMDk7IENoaSwgWmh1LCAyMDE5KS4gVGhlIGJlbmVmaXRzIG9mIHRoZSBTTE0gaXMgdGhhdCBpdCBhY2NvdW50cyBmb3IgdGhlIHdheSBpbiB3aGljaCBnZW9ncmFwaGljIHVuaXRzIGFyZSBzcGF0aWFsbHkgZGVwZW5kZW50LCB3aGljaCBpcyBhIHByb2JsZW0gb2YgdXNpbmcgcmVncmVzc2lvbiBtb2RlbHMgdGhhdCBkb27igJl0IGFjY291bnQgZm9yIHRoZSBzcGF0aWFsIGludGVyYWN0aW9ucyBvZnRlbiBhc3NvY2lhdGVkIHdpdGggcmVnaW9uYWwgZGF0YSAoRWxob3JzdCwgMjAxMCkuIER1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBzcGF0aWFsbHkgbGFnZ2VkIGRlcGVuZGVudCB2YXJpYWJsZeKAk+KAk29yIHRoZSB3ZWlnaHRlZCBhdmVyYWdlIG9mIGEgZ2l2ZW4gZ2VvZ3JhcGhpYyB1bml0c+KAmSBuZWlnaGJvcmluZyBkZXBlbmRlbnQgdmFyaWFibGUgdmFsdWVz4oCT4oCTY2Fubm90IG1lcmVseSBiZSBpbnRlcnByZXRlZCBhcyBhbm90aGVyIGluZGVwZW5kZW50IHZhcmlhYmxlIGluIHRoZSBtb2RlbCwgYW5kIHRoZSBmYWN0IHRoYXQgaXRzIGluY2x1c2lvbiBpbnRvIHRoZSBtb2RlbCBtYWtlcyBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZXhwbGFuYXRvcnkgdmFyaWFibGUgY29lZmZpY2llbnRzIG1vcmUgY29tcGxleCwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJ1biBhbiBpbXBhY3QgYW5hbHlzaXMuCgpJbiByZWdhcmRzIHRvIGRpYWdub3N0aWNzIG1vcmUgZ2VuZXJhbGx5LCB0aGUgcmVzZWFyY2ggcHJvY2VzcyBhbHNvIHRha2VzIGludG8gYWNjb3VudCB0aGUgcHJvYmxlbXMgb2YgaGV0ZXJvc2tlZGFzdGljaXR5LCBtdWx0aWNvbGxpbmVhcml0eSwgYW5kIHNwYXRpYWwgZGVwZW5kZW5jZSBvZiB0aGUgcmVzaWR1YWxzLiBIZXRlcm9za2VkYXN0aWNpdHkgd2FzIHRlc3RlZCBmb3IgdXNpbmcgdGhlIEJyZXVzY2gtUGFnYW4gdGVzdC4gVGhlIHN0dWR5IGZhaWxlZCB0byByZWplY3QgdGhlIE51bGwgaHlwb3RoZXNpcyBvZiBob21vc2tlZGFzdGljaXR5LiBNdWx0aWNvbGxpbmVhcml0eSB3YXMgYWNjb3VudGVkIGZvciB1c2luZyB0aGUgVklGIHRlc3RzLCBhbmQgc3BlY2lmaWNhbGx5IG5vdGluZyBWSUZzID4gNS4gVG8gYXZvaWQgbXVsdGktY29sbGluZWFyaXR5LCB0aGlzIG1vZGVsIGRyb3BwZWQgYmFjaGVsb3IncyBkZWdyZWUgb3IgaGlnaGVyICUgZnJvbSB0aGUgbW9kZWxzLCBhbmQgdGhlcmVmb3JlIGZyb20gdGhlIGVudGlyZSBkYXRhc2V0LCBhcyBpdCBpc27igJl0IGluY2x1ZGVkIGhlcmUgb3IgaW4gVGFibGUgSSBpbiB0aGUgRGF0YSBzZWN0aW9uLiBUaGUgcmVzZWFyY2ggYWxzbyB0ZXN0ZWQgZm9yIHNwYXRpYWwgZGVwZW5kZW5jZSBvZiB0aGUgbW9kZWwgcmVzaWR1YWxzIHVzaW5nIHRoZSBNb250ZS1DYXJsbyBNb3JhbuKAmXMgSSB0ZXN0cyAoTiA9IDEsMDAwKSBvbiB0aGUgcmVzaWR1YWxzIGZyb20gdGhlIGluaXRpYWwgYW5kIGV4cGxvcmF0b3J5IE9yZGluYXJ5IExlYXN0IFNxdWFyZXMgKE9MUykgbW9kZWxzLCBhbmQgZm9sbG93aW5nIHRoZSBpbmNvcnBvcmF0aW9uIG9mIHRoZSBTcGF0aWFsIExhZyBNb2RlbHMgKFNMTSksIHRoZSByZXNpZHVhbHMgd2VyZSByZXRlc3RlZCB1c2luZyB0aGUgTW9udGUtQ2FybG8gTW9yYW7igJlzIEkuIFRoZSBPTFMgbW9kZWxzIHN1ZmZlcmVkIGZyb20gcG9zaXRpdmUgc3BhdGlhbCBkZXBlbmRlbmNlIG9mIHRoZSByZXNpZHVhbHMgYXQgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGxldmVsLCB3aGlsZSB0aGUgU0xNIG1vZGVscyBzaG93ZWQgbm8gZXZpZGVuY2Ugb2YgbmVnYXRpdmUgb3IgcG9zaXRpdmUgc3BhdGlhbCBhdXRvY29ycmVsYXRpb24uIAoKCiMjICoqKlJlc3VsdHMqKioKQWdncmVnYXRlcyBvZiBWYXJpb3VzIExhdyBFbmZvcmNlbWVudCBSYXRlcyBieSBQb3B1bGF0aW9uICAgClRvIGJlZ2luLCB0aGUgc3R1ZHkgcHJlc2VudHMgdGhlIGFnZ3JlZ2F0ZSB2aXN1YWxpemF0aW9uIG9mIGxhdyBlbmZvcmNlbWVudCBzdG9wIHJhdGVzLCBjaXRhdGlvbnMgYW5kIHNlYXJjaGVzIGFjcm9zcyB0aGUgQ2l0eSBvZiBMb3MgQW5nZWxlcy4gVGhlIHZpc3VhbGl6YXRpb24gc3BlY2lmaWNhbGx5IHJlcHJlc2VudHMgdGhlIGxhdyBlbmZvcmNlbWVudCBvdXRjb21lIGJ5IDEwLDAwMCByZXNpZGVudHMgYWNyb3NzIEJsYWNrLCBMYXRpbngsIFdoaXRlIGFuZCBBc2lhbiBtb3RvcmlzdHMuIFRoZXkgcmF0ZSB3YXMgY2FsY3VsYXRlZCBieSBmaW5kaW5ncyB0aGUgdG90YWwgbnVtYmVyIG9mIHN0b3BwZWQsIGNpdGVkLCBhbmQgc2VhcmNoZWQgZHJpdmVycyB0aGF0IHdlcmUgYWJsZSB0byBiZSBnZW9jb2RlZCBhbmQgc3BhdGlhbGx5IGpvaW5lZCB0byB0aGUgaW5jbHVkZWQgY2Vuc3VzIHRyYWN0cyB3aXRoaW4gdGhlIHNpdGUgb2Ygc3R1ZHksIGRpdmlkZWQgYnkgdGhlIGFnZ3JlZ2F0aW9uIG9mIHJhY2lhbCBzdWJwb3B1bGF0aW9ucyBhY3Jvc3MgdGhlIGluY2x1ZGVkIGNlbnN1cyB0cmFjdHMgd2l0aGluIHRoZSBzaXRlIG9mIHN0dWR5LiBUaGUgZGF0YSBjb21lcyBmcm9tIDEteWVhciBvZiBkYXRhLCBhbmQgaXTigJlzIGxpbWl0ZWQgdG8gY2Vuc3VzIHRyYWN0cyB3aXRoIGEgcG9wdWxhdGlvbiA+IDUwMCwgYW5kIGV4Y2x1ZGluZyBjZW5zdXMgdHJhY3RzIHN1Y2ggYXMgVUNMQSwgR3JpZmZpdGggUGFyaywgTEFYIGFuZCBEb2RnZXJzIFN0YWRpdW0uCgojIyMjIyAqKkZpZ3VyZSBJSS4gQWdncmVnYXRlIExhdyBFbmZvcmNlbWVudCBPdXRjb21lIFJhdGVzIGJ5IFJhY2lhbCBTdWJwb3B1bGF0aW9ucyBpbiBMb3MgQW5nZWxlcyoqCmBgYHtyLCBlY2hvID0gRkFMU0V9Cgprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2pvc2h1YWNhbnRvbmcvRGVza3RvcC9BY2FkZW1pY3MvU3ByaW5nIDIwMjIvU1NDSSA1NzQvUHJvZ3JhbW1pbmcvUmVzdWx0cy9hZ2dyZWdhdGUgcmF0ZSB2aXN1YWxpemF0aW9uLnBuZyIpCgpgYGAKCgpUaGUgbGFyZ2VzdCBmaW5kaW5nIGlzIHRoYXQgQmxhY2sgZm9sa3MgYXJlIG1vc3Qgb3ZlcnBvbGljZWQgYW5kIGZhciBtb3JlIG92ZXJwb2xpY2VkIHRoYW4gb3RoZXIgcmFjaWFsIHBvcHVsYXRpb25zIGFjcm9zcyB0aGUgY2l0eSwgYW5kIHRoYXQgTGF0aW54IGRyaXZlcnMgYXJlIGFsc28gbW9yZSBsaWtlbHkgdG8gYmUgc3RvcHBlZCBhbmQgc2VhcmNoZWQgcmVsYXRpdmUgdG8gV2hpdGUgYW5kIEFzaWFuIGZvbGtzLiBTcGVjaWZpY2FsbHksIHRoaXMgYW5hbHlzaXMgcmV2ZWFscyB0aGF0IEJsYWNrIGZvbGtzIGFyZSA0eCBtb3JlIGxpa2VseSB0byBiZSBzdG9wcGVkLCAzeCBtb3JlIGxpa2VseSB0byBiZSBjaXRlZCwgYW5kIDEyeCBtb3JlIGxpa2VseSB0byBiZSBzZWFyY2hlZCB0aGFuIFdoaXRlIHBlb3BsZSwgcmVsYXRpdmUgdG8gdGhlaXIgcG9wdWxhdGlvbiBzaXplLiBPbiB0aGUgb3RoZXIgaGFuZCwgTGF0aW54IGZvbGtzIGFyZSAxLjR4IG1vcmUgbGlrZWx5IHRvIGJlIHN0b3BwZWQsIGFuZCAzeCBtb3JlIGxpa2VseSB0byBiZSBzZWFyY2hlZCB0aGFuIFdoaXRlIHBlb3BsZSwgcmVsYXRpdmUgdG8gdGhlaXIgcG9wdWxhdGlvbiBzaXplLiBPbiB0aGUgb3RoZXIgaGFuZCwgV2hpdGUgYW5kIEFzaWFuIGRyaXZlcnMgYXJlIGxlYXN0IHBvbGljZWQgYWNyb3NzIHRoZSBsYXcgZW5mb3JjZW1lbnQgb3V0Y29tZXMgcHJlc2VudCBpbiB0aGlzIGFuYWx5c2lzOiBzdG9wIHJhdGVzLCBjaXRhdGlvbiByYXRlcyBhbmQgc2VhcmNoIHJhdGVzLiAKCkZvciB0aGUgcHVycG9zZSBvZiB0aGlzIHN0dWR5LCB0aGlzIHZpc3VhbGl6YXRpb24gcmV2ZWFscyB0aGUgc2hhcnAgcmFjaWFsIGRpc3Bhcml0eSBhY3Jvc3MgbGF3IGVuZm9yY2VtZW50IG91dGNvbWVzLiBTcGVjaWZpY2FsbHksIHRob3VnaCwgdGhpcyB3b3JrIHJldmVhbHMgdGhlIHdheSBpbiB3aGljaCByYWNpYWwgcHJvZmlsaW5nIGluIGxhdyBlbmZvcmNlbWVudCBvdXRjb21lcyByZWxhdGVkIHRvIGEgaGlnaGVyIGRlZ3JlZSBvZiBjaXRhdGlvbnPigJPigJNvciB0aWNrZXR0aW5n4oCT4oCTb2YgQmxhY2sgZm9sa3MuIFJhY2lhbCBwcm9maWxpbmcgaW4gc3RvcHMgdXBzdHJlYW0sIHdoZXJlaW4gQmxhY2sgZm9sa3MgYXJlIDR4IG92ZXJyZXByZXNlbnRlZCBpbiBzdG9wcyBjb21wYXJlZCB0byBXaGl0ZSBmb2xrcywgaXMgcmVsYXRlZCB0byBhIGhpZ2hlciBkZWdyZWUgb2YgY2l0YXRpb25zIGZvciBCbGFjayBmb2xrcy4gTmV4dCwgdGhpcyBzdHVkeSB3aWxsIGV4YW1pbmUgdGhlIGdlb2dyYXBoaWMgY29uY2VudHJhdGlvbiBvZiBsYXcgZW5mb3JjZW1lbnQgb3V0Y29tZXMgaW4gdGhlIENpdHkgb2YgTG9zIEFuZ2VsZXMuIAoKCiMjIyMjIEdldGlzLU9yZCBHaSogSG90IFNwb3QgQW5hbHlzaXMgCkluIHV0aWxpemluZyB0aGUgR2kqIG1ldGhvZHMsIGl04oCZcyBwb3NzaWJsZSB0byBkaXNwbGF5IHBvY2tldHMgb2YgaGlnaCBkZWdyZWVzIG9yIGxvdyBkZWdyZWUgb2YgbGF3IGVuZm9yY2VtZW50IG91dGNvbWVzIGFjcm9zcyB0aGUgQ2l0eSBvZiBMb3MgQW5nZWxlcy4gVGhlIHByZXZpb3VzIHZpc3VhbGl6YXRpb24gZGlzcGxheWVkIHRoZSByYWNpYWwgZGlzcGFyaXR5IGFjcm9zcyByYWNpYWwgc3VicG9wdWxhdGlvbnMsIGJ1dCBkaWRu4oCZdCBhZGRyZXNzIHRoZSBmYWN0b3Igb2Ygd2hlcmUgdGhvc2Ugb3V0Y29tZXMgd2VyZSBjb25jZW50cmF0ZWQgaW4gdGhlIGNpdHksIHJlbGF0ZWQgdG8gdGhlIHJhY2lvLWRlbW9ncmFwaGljIGNvbnRleHQgb2YgdGhlIGNpdHkuIEJlbG93LCB3ZSB2aXN1YWxpemUgYm90aCB0aGUgcmFjaWFsIGRlbW9ncmFwaGljIGRpc3RyaWJ1dGlvbiBhY3Jvc3MgdGhlIENpdHkgb2YgTG9zIEFuZ2VsZXMsIGFzIHdlbGwgYXMgR2kqIGhvdCBzcG90IG1hcHMgYWNyb3NzIHRoZSB0aHJlZSBsYXcgZW5mb3JjZW1lbnQgb3V0Y29tZXMgaW5jbHVkZWQgaW4gdGhlIHN0dWR5LiAKCiMjIyMjICoqRmlndXJlIElJSS4gUmFjaW8tRGVtb2dyYXBoaWMgRGlzdHJpYnV0aW9uIGluIHRoZSBDaXR5IG9mIExvcyBBbmdlbGVzKioKYGBge3IsIGVjaG8gPSBGQUxTRX0KCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvam9zaHVhY2FudG9uZy9EZXNrdG9wL0FjYWRlbWljcy9TcHJpbmcgMjAyMi9TU0NJIDU3NC9Qcm9ncmFtbWluZy9SZXN1bHRzL2RlbW9ncmFwaGljIGRpc3RyaWJ1dGlvbiB2aXN1YWxpemF0aW9uLnBuZyIpCgpgYGAKCgojIyMjIyAqKkZpZ3VyZSBJVi4gSG90IFNwb3QgQW5hbHlzaXMgb2YgTGF3IEVuZm9yY2VtZW50IE91dGNvbWVzIGluIHRoZSBDaXR5IG9mIExvcyBBbmdlbGVzKioKYGBge3IsIGVjaG8gPSBGQUxTRX0KCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvam9zaHVhY2FudG9uZy9EZXNrdG9wL0FjYWRlbWljcy9TcHJpbmcgMjAyMi9TU0NJIDU3NC9Qcm9ncmFtbWluZy9SZXN1bHRzL2hvdCBzcG90IGFuYWx5c2lzIHZpc3VhbGl6YXRpb24ucG5nIikKCmBgYAoKClRoZSBsYXJnZXN0IGZpbmRpbmdzIGZyb20gdGhpcyBhbmFseXNpcyBpcyB0aGF0IGhpZ2ggc2VhcmNoIHJhdGVzIGFyZSBjbHVzdGVyZWQgaW4gU291dGggTEEsIHdoaWNoIGlzIGEgcHJlZG9taW5hbnRseSBCbGFjayBhbmQgTGF0aW54IGdlb2dyYXBoeTsgYWZ0ZXIgdGhpcywgc3RvcCByYXRlcyBzZWVtIHRvIGJlIGNsdXN0ZXJlZCBzb21ld2hhdCBpbiBTb3V0aCBMQSwgYW5kIGNpdGF0aW9ucyBzZWVtIHRvIGhhdmUgdGhlIGZld2VzdCBob3Qgc3BvdHMgaW4gU291dGggTEEuIEFjcm9zcyBhbGwgaG90IEdpKiBtYXBzLCB0aGVyZSBzZWVtcyB0byBiZSBob3Qgc3BvdHMgaW4gdGhlIERUTEEgYXJlYSwgd2hpY2ggbWF5IGJlIHJlbGF0ZWQgdG8gdGhlIGhpZ2hlciBwb3B1bGF0aW9uIGluIHRoYXQgcmVnaW9uIG9mIHRoZSBjaXR5LiBNb3Jlb3ZlciwgdGhlIG1hcHMgZmluZCB0aGF0IHRoZXJlIGFyZSBzaWduaWZpY2FudCBjb2xkIHNwb3RzIGluIHNlYXJjaCByYXRlcyBpbiBXZXN0IExvcyBBbmdlbGVzIGFuZCBwYXJ0cyBvZiB0aGUgd2VzdGVybiBzZWdtZW50IG9mIHRoZSBTYW4gRmVybmFuZG8gVmFsbGV5LiBXaGF0IHRoZSBzZWFyY2ggcmF0ZSBtYXAgZGVtb25zdHJhdGVzIGlzIHRoYXQgd2hpbGUgcHJlZG9taW5hbnRseSBwb29yIGFuZCBCbGFjay9MYXRpbnggU291dGggTEEgaGFzIGEgaHVnZSBzZWdtZW50IG9mIGl0cyB0ZXJyYWluIG1hcmtlZCBieSBob3Qgc3BvdHMgZm9yIHNlYXJjaCByYXRlcywgdGhlIHByZWRvbWluYW50bHkgYWZmbHVlbnQgYW5kIFdoaXRlIFdlc3QgTEEgaGFzIGNvbGQgc3BvdHMgZm9yIHNlYXJjaGVzLiBXaGlsZSBjaXRhdGlvbnMgZG9u4oCZdCBzZWVtIHRvIGJlIGNsdXN0ZXJlZCB3aXRoaW4gU291dGggTEEsIHRoZXkgYXJlIGNsdXN0ZXJlZCBpbiBhcmVhcyBsaWtlIERUTEEsIENlbnRyYWwgTEEgKEhhcnZhcmQgSGVpZ2h0cyBhbmQgUGljby1VbmlvbiksIGFzIHdlbGwgYXMgaW4gVmVuaWNlLCBIb2xseXdvb2QsIEJldmVybHkgR3JvdmUsIGFuZCBGYWlyZmF4ICh1bmNvdmVyZWQgYnkgdGhlIHJlc2VhcmNoZXIgdXNpbmcgT3BlblN0cmVldHNNYXAgYXMgYSBpbnRlcmFjdGl2ZSBsZWFmbGV0IG1hcCB1bmRlcm5lYXRoIHRoZSBHaSogbWFwcykuIAoKIyMjIyMgKlNwYXRpYWwgTGFnIE1vZGVscyogCkxhc3RseSwgdGhpcyBwYXBlciBpcyBpbnRlcmVzdGVkIGluIGZpbmRpbmcgdGhlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGRpZmZlcmVudCBuZWlnaGJvcmhvb2QgbGV2ZWwgZmFjdG9ycyBhbmQgdGhlIHN0b3AsIGNpdGF0aW9uIGFuZCBzZWFyY2ggcmF0ZXMgYWNyb3NzIExvcyBBbmdlbGVzLiBUaGUgcmVncmVzc2lvbiB0YWJsZSBmb3IgdGhlIFNwYXRpYWwgTGFnIE1vZGVscyAoU0xNcykgYXJlIGJlbG93LCBhcyB3ZWxsIGFzIHRoZWlyIGltcGFjdHMgd2hpY2ggZGVtb25zdHJhdGUgdGhlIGRpcmVjdCwgaW5kaXJlY3QgYW5kIHRvdGFsIGVmZmVjdHMgZm9yIGVhY2ggaW5kZXBlbmRlbnQgdmFyaWFibGUuIChUaGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBlZmZlY3QgZWZmZWN0IG51bWJlcnMgcmVjb3JkIHdoZXRoZXIgdGhlIGNvZWZmaWNpZW50IG9mIGEgZ2l2ZW4gdmFyaWFibGUgaXMgbW9yZSBhc3NvY2lhdGVkIHdpdGggbmVpZ2hib3JpbmcgZ2VvZ3JhcGhpYyB1bml0c+KAmSBpbmRlcGVuZGVudCB2YWx1ZXMgW29yIGluZGlyZWN0IGVmZmVjdHNdLCBvciB0aGUgcmVmZXJlbmNlIGdlb2dyYXBoaWMgdW5pdOKAmXMgdmFsdWVzIFtvciBkaXJlY3QgZWZmZWN0c10pLiBMYXNhZ2UgJiBQYWNlICgyMDA5KSBub3RlIHRoYXQgaW5jbHVkaW5nIGltcGFjdHMgYXJlIGltcG9ydGFudCBmb3IgaW50ZXJwcmV0aW5nIHRoZSBjb2VmZmljaWVudHMgb2YgbW9kZWxzIHN1Y2ggYXMgdGhlIFNwYXRpYWwgRHVyYmluIE1vZGVsIChTRE0pIGFuZCB0aGUgU3BhdGlhbCBMYWcgTW9kZWwgKFNMTSnigJPigJNhbmQgdGhhdCBmYWlsaW5nIHRvIGRvIHNvIG1pZ2h0IG90aGVyd2lzZSByZXN1bHRzIGluIGEgbWlzaW50ZXJwcmV0YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0IGluIG9uZeKAmXMgcmVncmVzc2lvbiBtb2RlbChzKS4gCgojIyMjIyAqKlRhYmxlIElJLiBTcGF0aWFsIExhZyBSZWdyZXNzaW9ucyBmb3IgTGF3IEVuZm9yY2VtZW50IE91dGNvbWVzIGluIHRoZSBDaXR5IG9mIExvcyBBbmdlbGVzKioKYGBge3IsIGVjaG8gPSBGQUxTRX0KCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCIvVXNlcnMvam9zaHVhY2FudG9uZy9EZXNrdG9wL0FjYWRlbWljcy9TcHJpbmcgMjAyMi9TU0NJIDU3NC9Qcm9ncmFtbWluZy9SZXN1bHRzL3NwYXRpYWwgbGFnIG1vZGVsIHRhYmxlLnBuZyIpCgpgYGAKCgojIyMjIyAqKlRhYmxlIElJSS4gSW1wYWN0cyBmb3IgU3RvcCBSYXRlIFNMTSBpbiB0aGUgQ2l0eSBvZiBMb3MgQW5nZWxlcyoqCmBgYHtyLCBlY2hvID0gRkFMU0V9Cgprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2pvc2h1YWNhbnRvbmcvRGVza3RvcC9BY2FkZW1pY3MvU3ByaW5nIDIwMjIvU1NDSSA1NzQvUHJvZ3JhbW1pbmcvUmVzdWx0cy9zdG9wIHJhdGUgaW1wYWN0IHRhYmxlLnBuZyIpCgpgYGAKCgojIyMjIyAqKlRhYmxlIElWLiBJbXBhY3RzIGZvciBDaXRhdGlvbiBSYXRlIFNMTSBpbiB0aGUgQ2l0eSBvZiBMb3MgQW5nZWxlcyoqCmBgYHtyLCBlY2hvID0gRkFMU0V9Cgprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiL1VzZXJzL2pvc2h1YWNhbnRvbmcvRGVza3RvcC9BY2FkZW1pY3MvU3ByaW5nIDIwMjIvU1NDSSA1NzQvUHJvZ3JhbW1pbmcvUmVzdWx0cy9jaXRhdGlvbiByYXRlIGltcGFjdCB0YWJsZS5wbmciKQoKYGBgCgoKIyMjIyMgKipUYWJsZSBWLiBJbXBhY3RzIGZvciBTZWFyY2ggUmF0ZSBTTE0gaW4gdGhlIENpdHkgb2YgTG9zIEFuZ2VsZXMqKgpgYGB7ciwgZWNobyA9IEZBTFNFfQoKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIi9Vc2Vycy9qb3NodWFjYW50b25nL0Rlc2t0b3AvQWNhZGVtaWNzL1NwcmluZyAyMDIyL1NTQ0kgNTc0L1Byb2dyYW1taW5nL1Jlc3VsdHMvc2VhcmNoIHJhdGUgaW1wYWN0IHRhYmxlLnBuZyIpCgpgYGAKCgpUaGUgbGFyZ2VzdCBmaW5kaW5nIGZyb20gdGhlc2UgcmVzdWx0cyBpcyB0aGF0IHRoZXJlIGFyZSBwb3NpdGl2ZSBhc3NvY2lhdGlvbnMgZm9yIEJsYWNrIGFuZCBMYXRpbnggcG9wdWxhdGlvbnMgYWNyb3NzIHN0b3BzIGFuZCBzZWFyY2hlcy4gVGhpcyBtZWFucyB0aGF0IGFzIGEgY2Vuc3VzIHRyYWN0c+KAmSBzaGFyZSBvciBCbGFjayByZXNpZGVudHMgaW5jcmVhc2VzLCBvciBhcyBhIGNlbnN1cyB0cmFjdHPigJkgc2hhcmUgb2YgTGF0aW54IHJlc2lkZW50cyBpbmNyZWFzZXMsIHRoZXJlIGlzIGFuIGluY3JlYXNlIGluIHRoZSByYXRlIG9mIHJlc2lkZW50cyBzdG9wcGVkLCBhcyB3ZWxsIGFzIGFuIGluY3JlYXNlIGluIHRoZSByYXRlIG9mIHJlc2lkZW50cyBzZWFyY2hlZOKAk+KAk2NvbnRyb2xsaW5nIGZvciBvdGhlciB2YXJpYWJsZXMuIEZ1cnRoZXJtb3JlLCB0aGUgYW5hbHlzaXMgcmV2ZWFscyB0aGF0IHBvdmVydHkgcmF0ZSBpcyBhbHNvIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIGFsbCB0aHJlZSBsYXcgZW5mb3JjZW1lbnQgcmF0ZXMgaW5jbHVkZWQgaW4gdGhlIHN0dWR5LiBUaGVyZSBhcmUsIGZ1cnRoZXJtb3JlLCBuZWdhdGl2ZSBhc3NvY2lhdGlvbnMgd2l0aCB0aGUgd29tZW4gcG9wdWxhdGlvbiBzaGFyZSBvZiBhIHRyYWN0LCBhcyB3ZWxsIGFzIHRoZSByZW50ZXIgaG91c2Vob2xkIHNoYXJlIG9mIGEgdHJhY3QuCgpUaGUgaW1wYWN0IGFuYWx5c2lzIHJldmVhbHMgdGhlIGRpcmVjdCBlZmZlY3RzIGFuZCBpbmRpcmVjdCBlZmZlY3RzIGVudGFpbGVkIGFjcm9zcyBvdXIgaW5kZXBlbmRlbnQgdmFyaWFibGVzLiBUaGUgaW1wYWN0IHJlc3VsdHMgZm9yIHN0b3BzIGFuZCBjaXRhdGlvbnMgbGVhZHMgdG8gYW4gaW50ZXJlc3RpbmcgZmluZGluZzogd2hpbGUgdGhlcmUgaXMgYSBuZWdhdGl2ZSBhc3NvY2lhdGlvbiB3aXRoIHJlbnRlciBob3VzZWhvbGQgc2hhcmUgYW5kIHN0b3AgcmF0ZSBhbmQgY2l0YXRpb24gcmF0ZSwgaXQgYXBwZWFycyB0aGF0IHRoaXMgbmVnYXRpdmUgYXNzb2NpYXRpb24gaXMgZHVlIHRvIHRoZSBpbmRpcmVjdCBlZmZlY3Qgb2YgdGhlIGF2ZXJhZ2Ugc2hhcmUgb2YgY2Vuc3VzIHRyYWN0c+KAmSBhcm91bmQgYW4gaW5kaXZpZHVhbCBnZW9ncmFwaHkuIEhvdyBkb2VzIHRoaXMgd29yayBpbiBwcmFjdGljZT8gV2UgbWlnaHQgcmVhZCBpdCBhcyBzdWNoOiB0aGUgbmVnYXRpdmUgYXNzb2NpYXRpb24gd2l0aCByZW50ZXIgaG91c2Vob2xkIHNoYXJlIGFuZCBzdG9wL2NpdGF0aW9uIHJhdGVzIGFyZSByZWxhdGVkIHRvIGEgZ2l2ZW4gdHJhY3TigJlzIG5laWdoYm9ycyBhbmQgdGhlaXIgc2hhcmUgb2YgcmVudGVyIGhvdXNlaG9sZHMsIGFuZCBub3QgbmVjZXNzYXJpbHkgc3Ryb25nbHkgcmVsYXRlZCB0byB0aGUgcmVudGVyIGhvdXNlaG9sZCBzaGFyZSBvZiBhIHJlZmVyZW5jZSB0cmFjdC4gSXQgc2VlbXMgdGhhdCB0aGVyZeKAmXMgYW4gaW5kaXJlY3Qgc3VwcHJlc3NpdmUgZWZmZWN0IHJlbGF0ZWQgdG8gcmVudGVyIGhvdXNlaG9sZCBzaGFyZeKAk+KAk2F0IGxlYXN0IHdoZW4gY29udHJvbGxpbmcgZm9yIG90aGVyIHZhcmlhYmxlcy4gQW5vdGhlciBpbnRlcmVzdGluZyBmaW5kaW5ncyBpcyByZWxhdGVkIHRvIGhvdyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBlZmZlY3RzIG9mIHBvdmVydHkgcmF0ZSBjaGFuZ2UgYWNyb3NzIHRoZSBjaXRhdGlvbiBhbmQgc2VhcmNoIHJhdGUgbW9kZWxzLiBXaGlsZSBib3RoIG1vZGVscyBoYXZlIGEgcG9zaXRpdmUgYXNzb2NpYXRpb24gd2l0aCBwb3ZlcnR5IHJhdGUsIGl0IGFwcGVhcnMgdGhhdCBjaXRhdGlvbiByYXRlcyBoYXZlIGEgbGFyZ2UgaW5kaXJlY3QgZWZmZWN0LCB3aGlsZSBwb3ZlcnR5IHJhdGUgaGFzIGEgbGFyZ2UgZGlyZWN0IGVmZmVjdC4gCgpJbiB0dXJuaW5nIHRvIHRoZSBBa2Fpa2UgSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChBSUMpIGFuYWx5c2lzLCB3aGljaCBhbGxvd3MgdXMgdG8gc2VlIHRoZSBnb29kbmVzcyBvZiBmaXQgYWNyb3NzIG91ciBkaWZmZXJlbnQgbW9kZWxzLCBvciB0aGUgZGVncmVlIHRvIHdoaWNoIGEgbW9kZWwgZGVzY3JpYmVzIHRoZSBhY3R1YWwgZGF0YSBnZW5lcmF0aW5nIHByb2Nlc3MsIGl04oCZcyBhcHBhcmVudCB0aGF0IHRoZSBzZWFyY2ggbW9kZWwgaXMgdGhlIG1vc3QgcHJlZGljdGl2ZSwgd2hpbGUgdGhlIHN0b3AgYW5kIGNpdGF0aW9uIG1vZGVscyB0cmFpbCBpbiB0aGVpciBlZmZpY2FjeS4gVGhlIEFJQyBmb3IgdGhlIHNlYXJjaCByYXRlIG1vZGVsIGlzIDIsMDg1OyB0aGUgQUlDIGZvciB0aGUgc3RvcCByYXRlIG1vZGVsIGlzIDIsMzgwOyBhbmQgdGhlIEFJQyBmb3IgdGhlIGNpdGF0aW9uIHJhdGUgbW9kZWwgaXMgMiw4MjguIEFub3RoZXIgZmFjdG9yIHJlbGF0ZWQgdG8gZXZhbHVhdGluZyB0aGVzZSBBSUNzIGlzIHRoYXQgdGhlIGRpZmZlcmVudCBkZXBlbmRlbnQgdmFyaWFibGUgbWF5IGhpbmRlciB0aGUgdXNlIG9mIHRoZSBBSUMgdG8gY29tcGFyZSBhY3Jvc3MgdGhlIG1vZGVscywgYnV0IGluIHJ1bm5pbmcgT0xTIG1vZGVscyBwcmlvciB0byB0aGUgU3BhdGlhbCBMYWcgTW9kZWxzIGFuZCBvYnNlcnZpbmcgdGhlIHJlbGF0aXZlIGRpZmZlcmVudCBvZiBhZGp1c3RlZCBSXjIsIGl0IHNlZW1zIHRoYXQgdGhlIGxldmVsIG9mIGZpdCBhY3Jvc3MgbW9kZWxzIGNhcnJpZXMgb3ZlciB3aXRoIHRoZSBBSUMgZmlndXJlcy4gV2h5IG1pZ2h0IHRoZSBzZWFyY2ggbW9kZWwgYmUgbW9yZSBwcmVkaWN0aXZlIHdoaWxlIHRoZSBjaXRhdGlvbiBtb2RlbCBtYXkgYmUgbGVzcyBwcmVkaWN0aXZlPyBJZiB0aGlzIHJlc3VsdCBpcyB2aWV3ZWQgaW4gY29udGV4dCB3aXRoIHRoZSBHZXRpcy1PcmQgR2kqIGFuYWx5c2lzLCB0aGVuIHdlIG1pZ2h0IHVuZGVyc3RhbmQgdGhlIGRpZmZlcmVuY2Ugb2YgZml0IGFjcm9zcyB0aGVzZSBkZXBlbmRlbnQgdmFyaWFibGVzLiBUaGUgc2VhcmNoIHJhdGUgaG90IHNwb3QgYW5hbHlzaXMgc2hvd2VkIGEgc3Ryb25nIGNsdXN0ZXJpbmcgb2YgaG90IHNwb3RzIGluIFNvdXRoIExBLCB3aGljaCBpcyBhIEJsYWNrLUxhdGlueCBnZW9ncmFwaHk7IG9uIHRoZSBvdGhlciBoYW5kLCB0aGUgY2l0YXRpb24gcmF0ZSBtb2RlbCBzaG93ZWQgdmVyeSBtaW5pbWFsIGFuZCB0aGUgbGVhc3QgYW1vdW50IG9mIGNsdXN0ZXJpbmcgYWNyb3NzIHRoZSB3aG9sZSBjaXR5LCBpbiByZWxhdGlvbiB0byB0aGUgb3RoZXIgZGVwZW5kZW50IHZhcmlhYmxlIG1hcHMuIFdoaWxlIHdlIGtub3cgdGhhdCByYWNpYWwgcHJvZmlsaW5nIG9jY3VycyBhbmQgaW1wYWN0cyBCbGFjayBkcml2ZXJzIHByZWRvbWluYW50bHksIGFuZCBMYXRpbnggZHJpdmVycyBzaWduaWZpY2FudGx5IGFzIHdlbGzigJPigJN0aGVzZSBmaW5kaW5ncyBhbGxvdyB1cyB0byBzZWUgdGhhdCBjaXRhdGlvbiBkaXNwYXJpdHkgbWF5IGhhdmUgYSBsYXJnZXIgZGlzcGFyaXR5IGF0IHRoZSBsZXZlbCBvZiB0aGUgaW5kaXZpZHVhbC9ib2R5LCBhbmQgbm90IGF0IHRoZSBnZW9ncmFwaGljIGFnZ3JlZ2F0ZS4gT24gdGhlIG90aGVyIGhhbmQsIG91ciBmaW5kaW5ncyByZXZlYWwgdGhhdCBzZWFyY2ggcmF0ZXMgaGF2ZSBib3RoIGEgZGlzcGFyaXR5IGF0IHRoZSBzY2FsZSBvZiB0aGUgaW5kaXZpZHVhbCwgYXMgd2VsbCBhcyBhIGRpc3Bhcml0eSBhdCB0aGUgc2NhbGUgb2YgdGhlIGdlb2dyYXBoaWMgYWdncmVnYXRlLiAKCihhcyBub3RlZCBpbiB0aGUgbWV0aG9kcyBzZWN0aW9uLCB0aGVzZSBtb2RlbHMgYWNjb3VudGVkIGZvciBtdWx0aWNvbGxpbmVhcml0eSwgaGV0ZXJvc2tlZGFzdGljaXR5LCBhbmQgdGhlIHNwYXRpYWwgZGVwZW5kZW5jZSBvZiB0aGUgcmVzaWR1YWxzIGZyb20gcHJpb3Igbm9uc3BhdGlhbCByZWdyZXNzaW9ucy4pCgojIyAqKipEaXNjdXNzaW9uKioqCldoYXQgYXJlIHRoZSBpbXBsaWNhdGlvbnMgZm9yIHRoaXMgcmVzZWFyY2g/IEZpcnN0LCB0aGlzIHJlc2VhcmNoIHBvaW50cyB0b3dhcmRzIHJhY2lhbCBkaXNwYXJpdGllcyBhY3Jvc3MgYWxsIHRocmVlIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGVzIG9mIGludGVyZXN0OiAodmVoaWN1bGFyKSBzdG9wcywgY2l0YXRpb25zIGFuZCBzZWFyY2hlcy4gVGhlIGFuYWx5c2lzIGFsc28gdW5jb3ZlcmVkIHRoYXQgc3RvcHMgYW5kIHNlYXJjaGVzIGFyZSBwb3NpdGl2ZWx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2hhcmUgb2YgYmxhY2sgYW5kIGxhdGlueCByZXNpZGVudHMgb2YgYW4gYXJlYS4gTGFzdGx5LCB3ZSB1bmNvdmVyZWQgdGhhdCB3aGlsZSBkaXNwYXJpdGllcyBpbiBzZWFyY2hlcyBvY2N1ciBhdCB0aGUgbGV2ZWwgb2YgdGhlIGJvZHkgYW5kIHRoZSBnZW9ncmFwaGljIGFnZ3JlZ2F0ZSwgd2UgZm91bmQgdGhhdCBkaXNwYXJpdGllcyBpbiBjaXRhdGlvbnMgb2NjdXIgZXNwZWNpYWxseSBhdCB0aGUgbGV2ZWwgb2YgdGhlIGJvZHkgYnV0IG5vdCBuZWNlc3NhcmlseSBhdCB0aGUgbGV2ZWwgb2YgdGhlIGdlb2dyYXBoaWMgYWdncmVnYXRlIChvciBtaW5pbWFsbHkgc28gYXQgdGhpcyBsZXZlbCBvZiBhZ2dyZWdhdGlvbikuIE1vcmUgc28sIHRoaXMgcmVzZWFyY2ggZm9jdXNlcyBlc3BlY2lhbGx5IG9uIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHRoZXNlIHZhcmlhYmxlcywgYnV0IGFsc28gZXNwZWNpYWxseSBob3cgbGF3IGVuZm9yY2VtZW50IHN0b3BzIGdlbmVyYXRlIGFuIHVuZHVlIGVjb25vbWljIGJ1cmRlbiBvbiBCbGFjayByZXNpZGVudHMgZHVlIHRvIGZpbmUgZmFybWluZywgb3IgdGhlIGRpc3BhcmF0ZSBsZXZ5aW5nIG9mIHRpY2tldHMgb24gQmxhY2sgbW90b3Jpc3RzIGNhdXNlZCBieSByYWNpYWwgcHJvZmlsaW5nLiBXaGlsZSB0aGVzZSBmaW5kaW5ncyBhcmUgbm92ZWwsIHRoZWlyIGltcGxpY2F0aW9ucyBhcmUgZXZlbiBtb3JlIHNpZ25pZmljYW50LiBJbiB0aGlzIHBhcnRpY3VsYXIgaGlzdG9yaWNhbCBjb250ZXh0LCBmb2xsb3dpbmcgdGhlIHBvbGljZSBraWxsaW5ncyBvZiBCbGFjayBmb2xrcyBpbiB0aGUgbGFzdCBkZWNhZGUgYW5kIGluIHJlbGF0aW9uIHRvIHRoZSBCbGFjayBMaXZlcyBNYXR0ZXIgbW92ZW1lbnQsIHRoaXMgd29yayBwb2ludHMgdG93YXJkcyB0aGUgd2F5cyBpbiB3aGljaCBsYXcgZW5mb3JjZW1lbnQgaW5zdGl0dXRpb25zIGRvbuKAmXQgc2VjdXJlIHB1YmxpYyBzYWZldHkgYXMgbXVjaCBhcyB0aGV5IHdvcmsgdG8gc2VjdXJlIHJhY2lhbCBkaWZmZXJlbmNlcywgdmlvbGVuY2UsIGFuZCBlY29ub21pYyBzYW5jdGlvbnMgaW4gbG93LWluY29tZSBjb21tdW5pdGllcyBhbmQgdXBvbiBsb3ctaW5jb21lIGJvZGllcyBvZiBjb2xvci4gCiAgICAKVGhlIHJlc2VhcmNoIGNhbiBiZSBleHBhbmRlZCB3aXRoIGZ1dHVyZSB3b3JrLiBGaXJzdCwgdGhlIHN0dWR5IG9ubHkgY29udGFpbnMgb25lIHllYXIgb2YgZGF0YeKAk+KAk3NvIGZ1dHVyZSB3b3JrIHNob3VsZCBleHBhbmQgdGhpcyBhbmFseXNpcyB0byBtdWx0aXBsZSB5ZWFycywgcG90ZW50aWFsbHkgZXZlbiB1c2luZyBzcGF0aWFsIHBhbmVsIHNldHMgdG8gbWFrZSB0aGUgZmluZGluZ3MgbW9yZSByb2J1c3QuIFNlY29uZCwgdGhlc2UgZmluZGluZ3MgYXJlIGNvbnRpbmdlbnQgb24gdGhlIHZhbGlkaXR5IG9mIHRoZSBtZXRob2RzIGluIHdoaWNoIGxhdyBlbmZvcmNlbWVudCBvZmZpY2VycyByZWNvcmQgdmFsaWQgZGF0YSB0aGF0IGFyZSBpbiBsaW5lIHdpdGggdGhlIHN0YW5kYXJkcyBvZiB0aGUgUmFjaWFsIGFuZCBJZGVudGl0eSBQcm9maWxpbmcgQWN0IChSSVBBKSBvZiAyMDE1LiBJbiBjb25uZWN0aW9uIHdpdGggdGhpcywgaXQgbXVzdCBiZSByZW1lbWJlcmVkIHRoYXQgdGhlIHJhY2lhbCBjbGFzc2lmaWNhdGlvbnMgb2YgZHJpdmVycyB3aGljaCB0aGlzIHN0dWR5IHJlbGllcyBvbiwgaXMgY29udGluZ2VudCBvbiB0aGUgcGVyY2VwdGlvbnMgb2Ygb2ZmaWNlcnMgYW5kIGhvdyB0aGV5IHJlY29yZCBkcml2ZXJzLiBUaGlyZCwgd2UgZ2VvY29kZWQgfjY3MGsgc3RvcHMgYnV0IG91ciBjb252ZXJzYXRpb24gc3VjY2VzcyByYXRlIHdhcyBvbmx5IHNvbWV3aGVyZSBpbiB0aGUgODAtODUlIHJhbmdl4oCT4oCTZnV0dXJlIHJlc2VhcmNoIHNob3VsZCBpbXByb3ZlIGNsZWFuaW5nIG9mIGFkZHJlc3NlcyBhbmQgZ2VvY29kaW5nIHRlY2hub2xvZ3kgaW4gb3JkZXIgdG8gaW5jcmVhc2UgdGhlIHN1Y2Nlc3MgcmF0ZSBvZiBnZW9jb2RpbmcuIEZvdXJ0aCwgd2hlbiByZWZlcnJpbmcgdG8gdGhlIHByZWxpbWluYXJ5IE9MUyBtb2RlbHMsIHdlIGZpbmQgdGhhdCB0aGUgYWRqdXN0ZWQgUl4yIHZhbHVlcyB3ZXJlIGVpdGhlciBtb2RlcmF0ZSBvciBsb3cgZm9yIHN0b3BzICh+LjI1KSBhbmQgY2l0YXRpb25zICh+LjEzKS4gRnV0dXJlIG1vZGVscyBzaG91bGQgaW5jbHVkZSBtb3JlIG9taXR0ZWQgdmFyaWFibGVzLCBsaWtlIGR1bW15IHZhcmlhYmxlcyBmb3IgaGlnaHdheXMgaW50ZXJzZWN0aW5nIHdpdGggcGFydGljdWxhciB0cmFjdHMsIG9yIGludGVyYWN0aW9uIHdpdGggaGlnaHdheSBpbnRlcnNlY3Rpb25zIGFuZCBhIGxhcmdlciBwb3B1bGF0aW9uIG9mIGJsYWNrIGFuZCBsYXRpbnggcmVzaWRlbnRzLiAKCgoKIyMgKioqQ29uY2x1c2lvbioqKgpUaGlzIHJlc2VhcmNoIGFuc3dlcmVkIHRoZSByZXNlYXJjaCBxdWVzdGlvbnMgZmlyc3QgZnJhbWVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyB3b3JrLiBUaGV5IGFyZSBhcyBmb2xsb3dzOiBJKSBBcmUgbGF3IGVuZm9yY2VtZW50IHN0b3BzIGFuZCBvdXRjb21lcyAoZWcuIGNpdGF0aW9ucyBhbmQgc2VhcmNoZXMpIGNsdXN0ZXJlZCBpbiBwYXJ0aWN1bGFyIGNvbW11bml0aWVzIGFjcm9zcyBMb3MgQW5nZWxlcz8gLCBhbmQgSUkpIFdoYXQgYXJlIHRoZSBuZWlnaGJvcmhvb2QgZmFjdG9ycyBtb3N0IGFzc29jaWF0ZWQgd2l0aCB0aGVzZSBzdG9wIGFuZCBvdXRjb21lIChlZy4gY2l0YXRpb24gYW5kIHNlYXJjaCkgaW5jaWRlbmNlcyBpbiBMb3MgQW5nZWxlcz8gVGhlIGFuc3dlciB0byB0aGUgZmlyc3QgcXVlc3Rpb24gaXMgdGhhdCBhbGwgb3V0Y29tZXMgYXJlIGNsdXN0ZXJlZCBnZW5lcmFsbHkgaW4gZG93bnRvd24gTG9zIEFuZ2VsZXMgKERUTEEpIGFzIHdlbGwgYXMgSG9sbHl3b29kIGFuZCBWZW5pY2UgbW9yZSBnZW5lcmFsbHk7IG1vcmVvdmVyLCBzZWFyY2hlcyBhcmUgcGFydGljdWxhcmx5IGNsdXN0ZXJlZCBpbiBTb3V0aCBMQSwgd2hpY2ggaXMgYSBwcmVkb21pbmFudGx5IEJsYWNrLUxhdGlueCBnZW9ncmFwaHkuIFRoZSBhbnN3ZXIgdG8gdGhlIHNlY29uZCBxdWVzdGlvbiBpcyB0aGF0IHBvdmVydHksIGxhdGlueCBwb3B1bGF0aW9uIHNoYXJlIG9mIHRoZSBhcmVhLCBhbmQgYmxhY2sgcG9wdWxhdGlvbiBzaGFyZSBvZiB0aGUgYXJlYSBpcyBtb3N0IHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aHJlZSBkaWZmZXJlbnQgbGF3IGVuZm9yY2VtZW50IHN0b3BzLCBhbmQgdGhlbiB3b21lbiBwb3B1bGF0aW9uIHNoYXJlIG9mIHRoZSBhcmVhIGFuZCByZW50ZXIgaG91c2Vob2xkIHNoYXJlIG9mIHRoZSBhcmVhIGFyZSBuZWdhdGl2ZWx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF3IGVuZm9yY2VtZW50IG91dGNvbWVzIGFuYWx5emVkIGluIHRoaXMgc3R1ZHkgKHN0b3BzLCBjaXRhdGlvbnMgYW5kIHNlYXJjaGVzKS4gCgpUaGlzIHN0dWR5IHJldmVhbHMgdGhhdCBsYXcgZW5mb3JjZW1lbnQgYW5kIHRyYWZmaWMgZW5mb3JjZW1lbnQgYXJlIGEgdmVjdG9yIGZvciBpbmVxdWFsaXR5LiBCbGFjayBhbmQgTGF0aW54IGRyaXZlcnMgYXJlIG1vc3Qgc3ViamVjdGVkIHRvIHZlcnkgbGFyZ2UgZGlzcGFyaXRpZXMgaW4gc3RvcHMgYW5kIHNlYXJjaGVzIHRoYXQgYXJlIGNhdXNlZCBieSByYWNpYWwgcHJvZmlsaW5nLiBNb3Jlb3ZlciwgQmxhY2sgZHJpdmVycyBzcGVjaWZpY2FsbHkgYXJlIHN1YmplY3RlZCBkaXNwcm9wb3J0aW9uYXRlbHkgdG8gbGFyZ2UgZGlzcGFyaXRpZXMgaW4gY2l0YXRpb24gcmF0ZXMsIHdoaWNoIGNhbiBiZSB2aWV3ZWQgYXMgYSBuZWdhdGl2ZSBlY29ub21pYyBzYW5jdGlvbiB0aGF0IGltcGFjdHMgYSBwb3B1bGF0aW9uIHRoYXQgaXMgbGVzcyBhZmZsdWVudC4gUHJldmlvdXMgc3R1ZGllcyBoYXZlIGxpZnRlZCB1cCB0aGUgaW1wb3J0YW5jZSBvZiB2aWV3aW5nIHBvbGljZSBhcyBhIGZvcm0gb2YgU3RhdGUgdmlvbGVuY2UgKFdhY3F1YW50LCAyMDA4OyBXYW5nLCAyMDE4KSwgYW5kIHRoaXMgc3R1ZHkgY29udHJpYnV0ZXMgdG8gdGhhdCBsaXRlcmF0dXJlLCBwb2ludGluZyB0b3dhcmRzIHRoZSBpbnRlcnJlbGF0aW9uIG9mIHN0b3BzLCBjaXRhdGlvbiBhbmQgc2VhcmNoZXMsIGFuZCB0aGUgbWF0ZXJpYWwtZWNvbm9taWMgZGlzcGFyaXRpZXMgZW50YWlsZWQgaW4gdGhlIHNlYXJjaCBwcm9jZXNzLiAgCgoKIyMgKioqUmVmZXJlbmNlcyoqKgpDaGksIEcuLCBaaHUsIEouICgyMDE5KS4gKlNwYXRpYWwgUmVncmVzc2lvbiBNb2RlbHMgZm9yIHRoZSBTb2NpYWwgU2NpZW5jZXMqLiBUaG91c2FuZCBPYWtzLCBDQTogU0FHRSBQdWJsaWNhdGlvbnMuCgpDb2xsaW5zLCBDLiwgU3R1YXJ0LCBGLiwgJiBKYW51bGlzLCBQLiAoMjAyMikuIFBvbGljaW5nIGdlbnRyaWZpY2F0aW9uIG9yIHBvbGljaW5nIGRpc3BsYWNlbWVudD8gVGVzdGluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gb3JkZXIgbWFpbnRlbmFuY2UgcG9saWNpbmcgYW5kIG5laWdoYm91cmhvb2QgY2hhbmdlIGluIExvcyBBbmdlbGVzLiAqVXJiYW4gU3R1ZGllcyogKEVkaW5idXJnaCwgU2NvdGxhbmQpLCA1OSgyKSwgNDE04oCTNDMzLiBodHRwczovL2RvaS5vcmcvMTAuMTE3Ny8wMDQyMDk4MDIxOTkzMzU0CgpFbGhvcnN0LCBKLlAuIDIwMTAuIOKAnEFwcGxpZWQgc3BhdGlhbCBlY29ub21ldHJpY3M6IFJhaXNpbmcgdGhlIGJhci7igJ0gKlNwYXRpYWwgRWNvbm9taWMgQW5hbHlzaXMqLCA1KDEpOiA5LTI4LgoKR2V0aXMsIEEuICgyMDA5KS4g4oCcU3BhdGlhbCBXZWlnaHRzIE1hdHJpY2VzLuKAnSAqR2VvZ3JhcGhpY2FsIEFuYWx5c2lzKiwgNDEoNCksIDQwNC00MTAuCgpMZVNhZ2UsIEouUC4sIGFuZCBSLksuIFBhY2UuICgyMDA5KS4gKkludHJvZHVjdGlvbiB0byBTcGF0aWFsIEVjb25vbWV0cmljcyouIEJvY2EgUmF0b24sIEZMOiBDUkMgUHJlc3MuCgpMaXZpbmdzLCBNLiBhbmQgQS4gV3UsIDIwMjAuIOKAnExvY2FsIG1lYXN1cmVzIG9mIHNwYXRpYWwgYXNzb2NpYXRpb24u4oCdICpUaGUgR2VvZ3JhcGhpYyBJbmZvcm1hdGlvbiBTY2llbmNlICYgVGVjaG5vbG9neSBCb2R5IG9mIEtub3dsZWRnZSogKDNyZCBRdWFydGVyIDIwMjAgRWRpdGlvbiksIEpvaG4gUC4gV2lsc29uIChFZC4pCgpNYWtzdXRhLCBLLiBELiAoMjAyMSkuIEV4cGxvcmluZyBHcm91cC1UaHJlYXQgYW5kIFBvbGljZS1JbnZvbHZlZCBIb21pY2lkZTogQSBTcGF0aWFsIEFuYWx5c2lzIG9mIFBvbGljZSBJbnZvbHZlZCBIb21pY2lkZSBpbiBVUyBDb3VudGllcyAoT3JkZXIgTm8uIDI4NjQ5ODg2KS4gKlByb1F1ZXN0IERpc3NlcnRhdGlvbnMgJiBUaGVzZXMgR2xvYmFsOyBQcm9RdWVzdCBPbmUgQWNhZGVtaWMqLiBodHRwczovL3d3dy5wcm9xdWVzdC5jb20vZG9jdmlldy8yNTcxMDI2NzYxP2Zyb21vcGVudmlldz10cnVlJnBhcmVudFNlc3Npb25JZD16TmFXdlFteHROZGEwT1VJZ2Q2bDdVWGJHbjNKV0JLcVo4NGxyYWx6JTJGaU0lM0QmcHEtb3JpZ3NpdGU9Z3NjaG9sYXImYWNjb3VudGlkPTE0NzQ5CgpNZW5nLCBZLiAoMjAxNykuIFByb2ZpbGluZyBNaW5vcml0aWVzOiBQb2xpY2UgU3RvcCBhbmQgU2VhcmNoIFByYWN0aWNlcyBpbiBUb3JvbnRvLCBDYW5hZGEuICpIdW1hbiBHZW9ncmFwaGllcyosIDExKDEpLCA1LTIzLiBkb2kgaHR0cDovL2R4LmRvaS5vcmcvMTAuNTcxOS9oZ2VvLjIwMTcuMTExLjEKClBpZXJzb24sIEUuLCBTaW1vaXUsIEMuLCBPdmVyZ29vciwgSi4sIENvcmJldHQtRGF2aWVzLCBTLiwgSmVuc29uLCBELiwgU2hvZW1ha2VyLCBBLiwgUmFtYWNoYW5kcmFuLCBWLiwgQmFyZ2hvdXR5LCBQLiwgUGhpbGxpcHMsIEMuLCBTaHJvZmYsIFIuLCAmIEdvZWwsIFMuICgyMDIwKS4gQSBsYXJnZS1zY2FsZSBhbmFseXNpcyBvZiByYWNpYWwgZGlzcGFyaXRpZXMgaW4gcG9saWNlIHN0b3BzIGFjcm9zcyB0aGUgVW5pdGVkIFN0YXRlcy4gKk5hdHVyZSBIdW1hbiBCZWhhdmlvdXIqLCA0KDcpLCA3MzbigJM3NDUuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L3M0MTU2Mi0wMjAtMDg1OC0xCgpQb3N0b24sIEIuLCBDaGFuZywgQy4gKDIwMTkpLiBMQVBEIHNlYXJjaGVzIGJsYWNrcyBhbmQgTGF0aW5vcyBtb3JlLiBCdXQgdGhleeKAmXJlIGxlc3MgbGlrZWx5IHRvIGhhdmUgY29udHJhYmFuZCB0aGFuIHdoaXRlcy4gKlRoZSBMb3MgQW5nZWxlcyBUaW1lcyouIGh0dHBzOi8vd3d3LmxhdGltZXMuY29tL2xvY2FsL2xhbm93LyBsYS1tZS1sYXBkLXNlYXJjaGVzLTIwMTkwNjA1LXN0b3J5Lmh0bWwKClB1YmxpYyBSZWNvcmRzIFJlcXVlc3QgQ2l0eSBvZiBMb3MgQW5nZWxlcy4gKDIwMTkpIFJlcXVlc3QgIzE5LTc0NjcuIGh0dHBzOi8vbGFjaXR5Lm5leHRyZXF1ZXN0LmNvbS9yZXF1ZXN0cy8xOS03NDY3CgpSYWNpYWwgYW5kIElkZW50aXR5IFByb2ZpbGluZyBBZHZpc29yeSBCb2FyZC4gKDIwMTkpLiBBbm51YWwgUmVwb3J0IDIwMTkuIGh0dHBzOi8vb2FnLmNhLmdvdi9zaXRlcy9hbGwvZmlsZXMvYWd3ZWIvcGRmcy9yaXBhL3JpcGEtYm9hcmQtcmVwb3J0LTIwMTkucGRmCgpSb3NzLCBDLiBULiAoMjAxNSkuIEEgbXVsdGktbGV2ZWwgQmF5ZXNpYW4gYW5hbHlzaXMgb2YgcmFjaWFsIEJpYXMgaW4gcG9saWNlIHNob290aW5ncyBhdCB0aGUgY291bnR5LWxldmVsIGluIHRoZSBVbml0ZWQgU3RhdGVzLCAyMDExLTIwMTQuICpQbG9TIE9uZSosIDEwKDExKSwgZTAxNDE4NTTigJNlMDE0MTg1NC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEzNzEvam91cm5hbC5wb25lLjAxNDE4NTQKCldhY3F1YW50LCBMLiAoMjAwOCkuICpVcmJhbiBPdXRjYXN0czogQSBDb21wYXJhdGl2ZSBTb2Npb2xvZ3kgb2YgQWR2YW5jZWQgTWFyZ2luYWxpdHkqLiBQb2xpdHkgUHJlc3MuIAoKV2FuZywgSi4gKDIwMTgpLiAqQ2FyY2VyYWwgQ2FwaXRhbGlzbSouIFNlbWlvdGV4dGUuIAoKCgoKCgoKCgo=